leetcode978_最長湍流子數組_滑動窗口或動態規劃

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章