之前算法的练习基本都在leetcode上 所以无需编写有关输入数据的代码
所以到要需要完整编写全部代码时就很生疏了。
此题涉及到波峰和波谷的问题。波峰形式即为:小 大 小 这里的大为波峰,同理 大 小 大中的小为波谷。
找到波峰或者波谷时,在其后切一刀,前面的数据即为有序。
数据输入为:
3
2 4 1
输出为2(可以分为两段)
代码(c++):
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> a;
a.resize(n); #注意这句一定要加 不然出错
for(int i = 0;i<n;i++){
cin>>a[i];
}
int res = 1;
for(int j = 1;j<n-1;j++){
if(a[j]>a[j-1]&&a[j]>a[j+1]||a[j]<a[j-1]&&a[j]<a[j+1]){
res++;
if(j!=n-3){
j++;
}
}
}
cout<<res<<endl;
return 0;
}
找波峰或波谷 一定是要每次移两位,相当于在新的一个数组中从第二个数据开始判断。
为什么要在if语句里面判断j是否等于n-3 因为当j=n-3时,如果两次j++,则直接到j=n-1了不满足循环条件,
跳出循环,j=n-2时的数就会没有判断到。