题目描述:
在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数, 或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。
输入描述:
第一行是此数组的元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔。
输出描述:
每个案例输出为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
思路:常规思路就是这个数大于或小于它相邻的数就行,有两个特殊位置,一个是前两个数,一个是最后两个数,所以要分三种情况来讨论;
1. 当第一个数与第二个数不相等时,第一个数即为一个极值点
2.当最后一个数与倒数第二个数不相等时,最后一个数即为一个极值点
3.其他情况下只要大于所有它相邻的整数, 或者小于所有它相邻的整数。
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int main() {
int n,i=0;
int a[81] = { 0 };
while (scanf_s("%d",&n)!=EOF) {
for (i = 0;i < n;i++) {
scanf_s("%d", &a[i]);
}
if (a[0] != a[1]) {
printf("0 ");
}
for (i = 1;i <= n - 2;i++) {
if ((a[i - 1]<a[i] && a[i]>a[i + 1])
|| (a[i - 1] > a[i] && a[i] < a[i + 1])) {
printf("%d ", i);
}
}
if (a[n - 1] != a[n - 2]) {
printf("%d", n - 1);
}
}
return 0;
}
参考其他解法:https://blog.csdn.net/weixin_44235607/article/details/113172933
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int main() {
int n, i = 0;
cin >> n;
while (n>0) {
int k, a[81] = { 0 };
int c = 0,d = 0;
cin >> k;
for (i = 0;i < k;i++) cin >> a[i];
//第一个数和第二个数,这要两个数不相等,输出第一个数
if (a[1] != a[0]) cout <<"0 ";
for (i = 1;i < k - 1;i++) {
c = a[i + 1] - a[i];
d = a[i] - a[i - 1];
if (c * d < 0) cout << i<<" ";
}
if (a[k - 1] != a[k - 2]) cout << k - 1 << endl;
else cout << endl;
n--;
}
return 0;
}
个人觉得第一种解法思路更容易想到,第二种输出输出跟题目不太一样,需要改一下,不过扩展一下思维也不错。