目录
题目1:排序子序列中单调序列最少数
题目出处:https://www.nowcoder.com/questionTerminal/2d3f6ddd82da445d804c95db22dcc471
思路:找出极值点(满足 input[i] > input[i-1] && input[i] > input[i+1] 或者 input[i] < input[i-1] && input[i] < input[i+1]的点)。当上述循环最后一个极值下标为n-3
时,需要判断下标为n-
2
的数是否为极值,如果是ans+=
1,最后输出ans+1。
#include <iostream>
#include <vector>
using namespace std;
int main(){
int N;
cin >> N;
vector<int> input;
int v;
for(int i = 0; i < N; ++i){
cin >> v;
input.push_back(v);
}
vector<int> newA=input; //连续序列去重
/*for(int i = 0; i < N; ++i){
if(i == 0 || input[i] != input[i-1]){
newA.push_back(input[i]);
}
}*/
int ans = 1;
int n = newA.size();
for(int i = 1; i < n-1; ++i){
if(newA[i] > newA[i-1] && newA[i] > newA[i+1] || newA[i] < newA[i-1] && newA[i] < newA[i+1]){
++ans;
if(n-3!=i){
i++;
}
}
}
cout << ans << endl;
return 0;
}
题目2:序列相邻波峰和波谷的最大差
分析:找出每个极值点的位置,保存先前一个极值点,计算差值的绝对值,返回结果。
#include <iostream>
#include <vector>
using namespace std;
int main(){
int N;
cin >> N;
vector<int> input;
int v;
for(int i = 0; i < N; ++i){
cin >> v;
input.push_back(v);
}
int ans = 1;
int n = input.size();
int pre = input[0];
for(int i = 1; i < n-1; ++i){
if(input[i] > input[i-1] && input[i] > input[i+1] || input[i] < input[i-1] && input[i] < input[i+1]){
ans = max(ans, abs(pre-input[i]));
pre = input[i];
}
}
ans = max(ans, abs(pre-input[n-1]));
cout << ans << endl;
return 0;
}