首页 > 试题广场 >

打印极值点下标

[编程题]打印极值点下标
  • 热度指数:18414 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数, 或者小于所有它相邻的整数,则称该整数为一个极值点,极值点的下标就是i。

输入描述:
每个案例第一行为此数组元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔


输出描述:
每个案例输出为n个数字(其中n为该案例中极值点的个数):每个数字对应相应数组的相应极值点下标值,下标值之间用空格分隔。
示例1

输入

10
10 12 12 11 11 12 23 24 12 12
15
12 12 122 112 222 211 222 221 76 36 31 234 256 76 76 
15
12 14 122 112 222 222 222 221 76 36 31 234 256 76 73

输出

0 7
2 3 4 5 6 10 12
0 2 3 10 12 14
#include<iostream>
using namespace std;
int main(){
    int n;
    int a[101];
    while (cin>>n){
        for (int i=1;i<=n;i++)
            cin>>a[i];
        if (a[1]!=a[2])
            cout<<0<<" ";
        for (int i=2;i<n;i++)
            if ((a[i]>a[i-1]&&a[i]>a[i+1])||(a[i]<a[i-1]&&a[i]<a[i+1]))
                cout<<i-1<<" ";
        if (a[n-1]!=a[n])
            cout<<n-1;
        cout<<endl;
    }
    return 0;
}
编辑于 2018-03-16 16:57:57 回复(2)
#include <iostream>
using namespace std;
int main(){
int a[80];
int k;
while(cin>>k){
for(int i=0;i<k;i++){
cin>>a[i];
}
if(a[0]!=a[1])cout<<0<<" ";

for(int i=1;i<k-1;i++){
if((a[i]<a[i-1]&&a[i]<a[i+1])||(a[i]>a[i-1]&&a[i]>a[i+1])){
cout<<i<<" ";
}
}
if(a[k-2]!=a[k-1])cout<<k-1<<endl;
}
return 0;
}

编辑于 2019-03-02 18:48:49 回复(5)
这题感觉不难啊hhh,居然是4星,难道很多人数组下标越界了???
#include<iostream>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        int *a=new int[n];
        for(int i=0;i<n;i++)
            cin>>a[i];
        int *maxmin=new int[n];
        int count=0;
        for(int i=0;i<n;i++){
            if(i==0){
                if(a[i]<a[i+1]||a[i]>a[i+1])
                    maxmin[count++]=i;
            }
            else if(0<i&&i<n-1){
                if((a[i]<a[i+1]&&a[i]<a[i-1])||(a[i]>a[i+1]&&a[i]>a[i-1]))
                    maxmin[count++]=i;
            }
            else if(a[i]<a[i-1]||a[i]>a[i-1])
                maxmin[count++]=i;
        }
        for(int i=0;i<count;i++){
            if(i!=count-1)
                cout<<maxmin[i]<<' ';
            else cout<<maxmin[i];
        }
        cout<<endl;
    }
}

发表于 2019-02-08 20:40:40 回复(3)

python 解法

将数组分成三部分,第一部分是中间的,第二和第三分别是头两个数和最后两个数。

分别找出这三个部分的极值点,合起来就可以了。

def filterPeak(arr):
    a = list(
        filter(lambda i: (arr[i] < arr[i - 1] and arr[i] < arr[i + 1]) or (arr[i] > arr[i - 1] and arr[i] > arr[i + 1]),
               range(1, len(arr) - 1)))
    b = [0] if arr[0] != arr[1] else []
    c = [len(arr) - 1] if arr[-2] != arr[-1] else []
    return b + a + c


a, b = input(), list(map(int, input().split()))
print(" ".join(map(str, filterPeak(b))))
编辑于 2018-04-01 10:09:02 回复(1)
#include<stdio.h>
#include<vector>
using namespace std;



int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        int size;
        scanf("%d",&size);
        vector<int> vec(size,0);
        for(int j=0;j<size;j++){
            scanf("%d",&vec[j]);
        }
        vector<int> result;
        
        if(size>1){
            if(vec[0]>vec[1]||vec[0]<vec[1])
            	result.push_back(0);
        }
        
        for(int j=1;j<size-1;j++){
            if((vec[j-1]<vec[j]&&vec[j]>vec[j+1])||(vec[j-1]>vec[j]&&vec[j]<vec[j+1])){
                result.push_back(j);
            }
        }
        
        
        if(size>1){
        	if(vec[size-1]>vec[size-2]||vec[size-1]<vec[size-2]){
            	result.push_back(size-1);
        	}
        }
        
        for(int j=0;j<result.size()-1;j++){
            printf("%d ",result[j]);
        }
        printf("%d\n",result[result.size()-1]);
    }
    return 0;
}

发表于 2016-10-26 12:58:05 回复(0)
#include<iostream>
using namespace std;
int main(){
    int n;
    while(cin>>n){
    int a[n];
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    if(a[0]!=a[1]){
        cout<<0<<" ";
    }
    for(int i=1;i<n-1;i++){
        if(a[i-1]<a[i]&&a[i]>a[i+1]){
            cout<<i<<" ";
        }
         if(a[i-1]>a[i]&&a[i+1]>a[i]){
            cout<<i<<" ";
        }
        
    }    
        if(a[n-1]!=a[n-2]){
            cout<<n-1;
        }
        cout<<endl;
    }
}//通俗易懂 首尾判断是否和相邻的相等 不相等就一定是极值点直接输出 然后循环判断内部的

发表于 2022-04-04 16:27:55 回复(0)
#include<bits/stdc++.h> //万能头
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;


int main(){
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		int a[n];
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
		}
		for(int i=0;i<n;i++)
		{
			if(i==0)
			{
				if(a[i]!=a[i+1])
				{
					printf("%d ",i);
				}
			}
			else if(i==n-1)
			{
				if(a[i]!=a[i-1])
				{
					printf("%d ",i);
				}
			}
			else
			{
				if(  (a[i]<a[i-1]&&a[i]<a[i+1]) || (a[i]>a[i-1]&&a[i]>a[i+1])     )
				{
					printf("%d ",i);
				}
			}
		}
		printf("\n");
	} 
    return 0;
}


发表于 2020-09-10 11:45:03 回复(0)
#include<stdio.h>
int main()
{
    int n,i,a[80];
    while(scanf("%d",&n)!=EOF)
    {
         for(i=0;i<n;i++)//输入
            scanf("%d",&a[i]);
         for(i=0;i<n;i++)//比较
         {
             if((i==0&&a[i]!=a[i+1])||(i==n-1&&a[i]!=a[i-1]))//最前最后两个数特殊处理
             {printf("%d ",i);continue;}
             if((a[i]>a[i-1]&&a[i]>a[i+1])||(a[i]<a[i-1]&&a[i]<a[i+1]))
                 printf("%d ",i);
         }
        printf("\n");
    }
}

发表于 2020-04-01 22:29:15 回复(0)
Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int n = scanner.nextInt();
            int[] a = new int[n];
            for (int i = 0; i <n ; i++) a[i]= scanner.nextInt();
            System.out.print(0+" ");
            for (int i = 1; i < n-1; i++)
                if ((a[i]<a[i-1]&&a[i]<a[i+1])||(a[i]>a[i-1]&&a[i]>a[i+1]))
                    System.out.print(i+" ");
            System.out.println(n-1);
        }
    }
}


发表于 2020-03-18 19:26:03 回复(0)
#include<iostream>
using namespace std;
int main()
{
        int k;
        while (cin >> k)
        {
            int* a = new int[k];
            for (int i = 0; i < k; i++)
                cin >> a[i];
            for (int i = 0; i < k; i++)
            {
                if (i == 0  && a[i] != a[i + 1])
                {
                    cout << i << " ";
                    continue;
                }
                else if (i == k-1 && a[i] != a[i - 1])
                {
                    cout << i << " ";
                    continue;
                }
                else if ((a[i] < a[i - 1] && a[i] < a[i + 1]) || (a[i] > a[i - 1] && a[i] > a[i + 1]))
                    cout << i << " ";
            }
            delete []a;
            cout << endl;
        }
    return 0;
}

发表于 2020-02-20 17:12:15 回复(0)
try:
    while True:
        num,digitNum,result = int(input()),list(map(int,input().split())),[]
        if digitNum[0] != digitNum[1]:
            result.append(0)
        for i in range(1,num-1):
            if digitNum[i-1] < digitNum[i] > digitNum[i+1] or digitNum[i-1] > digitNum[i] < digitNum[i+1]:
                result.append(i)
        if digitNum[-1] != digitNum[-2]:
            result.append(num-1)
        print(" ".join(map(str,result)))
except Exception:
    pass
编辑于 2018-10-04 10:38:45 回复(0)
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
    int n,a[2000],b[2000],k=0;
    cin>>n;
    for(int i=0; i<n; i++)
        cin>>a[i];
    if(a[0]!=a[1])
        b[k++]=0;
    for(int i=1; i<n-1; i++)
    {
        if((a[i]>a[i+1]&&a[i]>a[i-1])||(a[i]<a[i+1]&&a[i]<a[i-1]))
        {
            b[k++]=i;
        }
    }
    if(a[n-1]!=a[n-2])
        b[k++]=n-1;
    for(int i=0; i<k; i++)
    {
        if(i<k-1)
            cout<<b[i]<<" ";
        else
            cout<<b[i]<<endl;
    }
    return 0;
}
 
发表于 2018-04-16 20:46:40 回复(1)
//#include<stdio.h>
/*注意输出格式:第一个输出不能空格开头,最后一个输出不能空格结尾*/
#include<iostream>
using namespace std;
#define N 82
int a[N];
int main()
{    
    int k,T;
    cin>>T;
    while(T--)
    {
        cin>>k;
        int flag=0;
        for(int i=0;i<k;i++)
            cin>>a[i];
        for(int i=0;i<k;i++)
        {
            if(i == 0 && a[i]!= a[i+1])
            {
                cout<<i;
                flag++;
            }
            else if(i == k-1 && a[i] != a[i-1])
            {
                if(flag == 0)
                    cout<<i;
                else
                    cout<<" "<<i;
                flag++;
            }
            else if((a[i]<a[i+1] && a[i]<a[i-1]) || (a[i]>a[i+1] && a[i]>a[i-1]))
            {
                 if(flag == 0)
                    cout<<i;
                else
                    cout<<" "<<i;
                 flag++;
            }
        }
        cout<<endl;
    }
    return 0;
}
发表于 2018-01-14 16:30:43 回复(0)
#include<iostream>
#include<cstdio>
using namespace std;

const int maxn = 82;

int num[maxn];

int main()
{
    int t;
    int n;
    cin >> t;
    while(t--)
    {
        cin >> n;
        for(int i = 0; i < n; ++i)
        {
            cin >> num[i];
        }

        // 判断
        int flag0 = 0;      // 标志输出空格 ' '
        int flag1 = 0;      // 标志是否为极值点
        for(int i = 0; i < n; ++i)
        {
            flag1 = 0;
            if(i == 0 && num[i] != num[i+1])        // i == 0
            {
                flag1 = 1;
            }
            else if(i == n-1 && num[i] != num[i-1]) // i == n-1
            {
                flag1 = 1;
            }
            else if((num[i] > num[i-1] && num[i] > num[i+1]) || (num[i] < num[i-1] && num[i] < num[i+1]))
            {
                flag1 = 1;
            }

            if(flag1 == 1)
            {
                if(flag0++)
                {
                    cout << " ";
                }
                cout << i;
            }
        }
        // end 判断
        cout << endl;
    }

    return 0;
}


发表于 2016-08-09 17:33:00 回复(0)
#include<bits/stdc++.h>
int main(){
    int n,a[80];
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<n;i++)
            if(i==0 && a[i]!=a[i+1])
                printf("%d ",i);
            else if(i==n-1 && a[i]!=a[i-1])
                printf("%d\n",i);
            else if(a[i]<a[i+1] && a[i]<a[i-1] || a[i]>a[i+1] && a[i]>a[i-1])
                printf("%d ",i);
    }
}
发表于 2019-03-14 15:24:34 回复(0)
这个题坑的地方是示例里多了案例数,就因为这个小问题浪费我半天时间,一直卡在自测可以,提交就不行。
发表于 2019-12-29 21:30:15 回复(3)
根本没有这个东西。
发表于 2020-01-06 18:41:35 回复(0)
#include<iostream>
#include<vector>
using namespace std;

int main() {
    int N = 0;
    cin >> N;
    vector<int>Array;
    Array.reserve(N);
    for (int i = 0; i < N; ++i) {
        int input;
        cin >> input;
        Array.emplace_back(input);
    }
    if (Array[0] != Array[1]) {
        cout << 0 << " ";
    }
    for (int i = 1; i < N - 1; ++i) {
        if ((Array[i] < Array[i + 1] && Array[i] < Array[i - 1]) ||
                (Array[i] > Array[i + 1] && Array[i] > Array[i - 1])) {
            cout << i << " ";
        }
    }
    if (Array[N] != Array[N - 1]) {
        cout << N - 1 << " ";
    }
}

编辑于 2024-01-28 16:36:33 回复(0)
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
	int n,A[100];
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> A[i];
	}
	if (A[0] > A[1] || A[0] < A[1])
		cout << 0<<" ";
	for (int i = 1; i < n-1; i++) {
		if (A[i] > A[i + 1] && A[i] > A[i - 1] || A[i] < A[i - 1] && A[i] < A[i + 1]) {
			cout << i<<" ";
		}
	}
	if (A[n-1] > A[n-2] || A[n-1] < A[n-2])
		cout << n-1<<" ";
	return 0;
}

发表于 2023-01-19 20:54:48 回复(0)
#include<bits/stdc++.h>
using namespace std;

int main() {
    int n;
    while(cin>>n) {
        int a[n];
        for(int i=0; i<n; i++) {
            cin>>a[i];
        }
        if(a[0]!=a[1]) {
            cout<<"0"<<" ";
        }
        for(int i=1; i<n-1; i++) {
            if(a[i]>a[i-1]&&a[i]>a[i+1]||a[i]<a[i-1]&&a[i]<a[i+1]) {
                cout<<i<<" ";
            }
        }
        if(a[n-2]!=a[n-1]){
            cout<<n-1<<endl;
        }
    }
    return 0;
}
发表于 2022-10-02 20:29:17 回复(0)