978. 最長湍流子陣列(滑動視窗、動態規劃)
阿新 • • 發佈:2021-02-09
一、題目描述
當 A 的子陣列 A[i], A[i+1], …, A[j] 滿足下列條件時,我們稱其為湍流子陣列:
若 i <= k < j,當 k 為奇數時, A[k] > A[k+1],且當 k 為偶數時,A[k] < A[k+1];
或 若 i <= k < j,當 k 為偶數時,A[k] > A[k+1] ,且當 k 為奇數時, A[k] < A[k+1]。
也就是說,如果比較符號在子陣列中的每個相鄰元素對之間翻轉,則該子陣列是湍流子陣列。
返回 A 的最大湍流子陣列的長度。
示例 1:輸入:[9,4,2,10,7,8,8,1,9]
輸出:5
解釋:(A[1] > A[2] < A[3] > A[4] < A[5])
示例 2:
輸入:[4,8,12,16]
輸出:2
示例 3:
輸入:[100]
輸出:1
*題目難度:中等
二、題解:
方法一:模擬
class Solution {
public int maxTurbulenceSize(int[] arr) {
int n = arr.length;
if(n==1) return n;
boolean greater = arr[0]>arr[ 1]?true:false;
boolean less = arr[0]<arr[1]?true:false;
int ans = 1;
int count = arr[0]==arr[1]?1:2;
for(int i=1;i<n-1;i++){
if(arr[i]<arr[i+1]&&greater){
count++;
greater = false;
less = true;
}else if(arr[i]>arr[i+1]&&less){
count++;
greater = true;
less = false;
}else{
ans = Math.max(ans,count);
count = arr[i]==arr[i+1]?1:2;
greater = arr[i]>arr[i+1]?true:false;
less = arr[i]<arr[i+1]?true:false;
}
}
ans = Math.max(ans,count);
return ans;
}
}
修改成滑動視窗的形式
class Solution {
public:
int maxTurbulenceSize(vector<int>& arr) {
int n = arr.size();
int left = 0;
int right = 0;
int ans = 0;
while(right+1<n){
if(left == right){
if(arr[left]==arr[left+1]){
left++;
}
right++;
}else{
if(arr[right-1]>arr[right]&&arr[right]<arr[right+1]
||arr[right-1]<arr[right]&&arr[right]>arr[right+1]){
right++;
}else{
ans = max(ans,right - left + 1);
left = right;
}
}
}
ans = max(ans,right - left + 1);
return ans;
}
};
方法二:動態規劃