前言:
21考研,不论能否进复试记录一下准备路上写下的垃圾代码。本来啃《算法笔记》,但是感觉太多了做不完,改做王道机试指南。
题目描述:
在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数, 或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。
输入描述
第一行是此数组的元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔。
输出描述:
每个案例输出为n行:每行对应于相应数组的所有极值点下标值,下标值之间用空格分隔。
解答
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
using namespace std;
vector<int> find_exm(vector<int> vi) {
//返回极值点向量
vector<int> res;
int temp;
if (vi[0] != vi[1]) {
temp = 0;
res.push_back(temp);
}
for (int i = 1; i < vi.size() - 1; i++) {
if ((vi[i] > vi[i - 1] && vi[i] > vi[i + 1]) || (vi[i] < vi[i - 1] && vi[i] < vi[i + 1])) {
temp = i;
res.push_back(temp);
}
}
if (vi[vi.size()-1] != vi[vi.size()-2]) {
temp = vi.size()-1;
res.push_back(temp);
}
return res;
}
int main()
{
int n,temp;
while (scanf("%d", &n) != EOF) {
vector<int> vi;
vector<int> res;
for (int i = 0; i < n; i++) {
scanf("%d", &temp);
vi.push_back(temp);
}
res = find_exm(vi);
for (int i = 0; i < res.size(); i++)
printf("%d ", res[i]);
printf("\n");
}
return 0;
}