解体思路
-
d
p
dp
dp的方法上次都写过了。
- 这次采用滑动窗口的方法
自己写的代码
// 动态规划方法
// class Solution {
// public:
// vector<vector<int>>dp;
// int maxTurbulenceSize(vector<int>& arr) {
// int n=arr.size();
// if(n<1){
// return 0;
// }
// else if(n==1){
// return 1;
// }
// dp.resize(2);
// dp[0].resize(n);
// dp[1].resize(n);
// dp[0][0]=dp[1][0]=0;
// for(int i=1;i<n;i++){
// if(arr[i]>arr[i-1]){
// dp[0][i]=dp[1][i-1]+1;
// }
// else if(arr[i]<arr[i-1]){
// dp[1][i]=dp[0][i-1]+1;
// }
// }
// int max0=dp[0][0],max1=dp[1][0];
// for(int i=1;i<n;i++){
// max0=max(dp[0][i],max0);
// max1=max(dp[1][i],max1);
// }
// int res=max(max0+1,max1+1);
// printf("%d\n",res);
// return res;
// }
// };
// 滑动窗口方法
class Solution {
public:
int res=0;
int maxTurbulenceSize(vector<int>& arr) {
int n = arr.size();
int left = 0, right = 0;
res=1;
while(right<n-1){
if(left==right){
// 这样写的好处是始终维护当==的时候长度为1,不会产生错误
if(arr[left]==arr[left+1]){
left++;
}
right++;
// while(right<n&&arr[left]==arr[right]){ // 这么写会产生[9,9]长度为2的错误答案
// left++;
// right++;
// }
}
else{
if(arr[right-1]<arr[right]&&arr[right]>arr[right+1]){
right++;
}
else if(arr[right-1]>arr[right]&&arr[right]<arr[right+1]){
right++;
}
else{
left=right;
}
}
res=max(res,right-left+1);
}
cout<<res<<endl;
return res;
}
};
官方代码
// 滑动窗口的方法,官方题解
class Solution {
public:
int maxTurbulenceSize(vector<int>& arr) {
int n = arr.size();
int ret = 1;
int left = 0, right = 0;
while (right < n - 1) {
if (left == right) {
if (arr[left] == arr[left + 1]) {
left++;
}
right++;
}
else {
if (arr[right - 1] < arr[right] && arr[right] > arr[right + 1]) {
right++;
} else if (arr[right - 1] > arr[right] && arr[right] < arr[right + 1]) {
right++;
} else {
left = right;
}
}
ret = max(ret, right - left + 1);
}
return ret;
}
};