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

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