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;
}
};