1. 程式人生 > 其它 >978. 最長湍流子陣列(滑動視窗、動態規劃)

978. 最長湍流子陣列(滑動視窗、動態規劃)

技術標籤:刷題筆記動態規劃leetcode滑動視窗

一、題目描述

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

方法二:動態規劃