1. 首先假设A[right]和A[right-1]之间的关系是大于小于等于分别为1,-1,0. 这样问题转化为最长的连续变换符号的1,-1,1,-1.......字符串长度有多长.
2. 然后我们可以用滑动窗口方法来做, 注意当条件不满足的时候再来计算,也就是先找到最长的可行解.
3. 依旧是套用滑动窗口模板.
class Solution {
public:
int compare(int a, int b) {
if(a>b) return 1;
else if(a<b) return -1;
else return 0;
}
int maxTurbulenceSize(vector<int>& A) {
//边界情况.
if(A.size()==1) return 1;
//right得从1开始,因为接下来right要和right-1的值进行比较.
int left=0, right=1;
//注意res也要是1, 因为如果是[9,9,9]是不会经过while循环的,
//此时的res结果应该是1.
int res = 1;
while(right<A.size()) {
//先找到前一个比较的符号c.
int c = compare(A[right-1], A[right]);
//等到不满足条件再更新,先找到最长的可行解.
if(right==A.size()-1 || c*compare(A[right], A[right+1])!=-1) {
//如果不出现[7,8,8,1]这种情况,则更新res.
if(c!=0) res = max(res, right-left+1);
left = right;
}
right++;
}
return res;
}
};
二. 1. 这种字符串的问题一般也可以考虑利用动态规划来写.
class Solution {
public:
int compare(int a, int b) {
return (a>b) ? 1: (a==b) ? 0 : -1;
}
int maxTurbulenceSize(vector<int>& A) {
//边界情况.
if(A.size()==1) return 1;
//设定dp数组,其中dp[i]代表的含义是以i结尾字符串最长湍流长度.
vector<int> dp(A.size());
dp[0] = 1;
//接下来for循环需要从2开始,但是dp[1]需要讨论情况.
//如果[9,9]这种,则dp[1]=1,否则都是2.
if(A[0]!=A[1]) dp[1] = 2;
else dp[1] = 1;
//最终最长的结果需要遍历dp数组.
int res = INT_MIN;
for(int i=2;i<A.size();i++) {
int flag = compare(A[i-2],A[i-1])*compare(A[i-1],A[i]);
//符合湍流数组条件.
if(flag == -1) dp[i]=dp[i-1]+1;
else {
//不符合,如果是等于号,则dp[i]=1.
//否则都是dp[i]=2.
if(compare(A[i-1],A[i])==0) dp[i] = 1;
else dp[i] = 2;
}
}
//遍历找到最长的结果.
for(int i=0;i<dp.size();i++) {
res = max(res, dp[i]);
}
return res;
}
};