LeetCode 978 最长湍流子数组 题解

LeetCode 978 最长湍流子数组 题解_第1张图片

这个题的思路非常简单,只是我的代码没有优化,用的时间复杂度是o(n+n),所以其实还好,给大家说说我的思路,对于本题,我们先研究第一种情况,我们可以通过双下标对其进行维护,再更新l和r下标的同时还能找出最长的湍流子数组的长度,然后就是去优化一些存在的问题即可

LeetCode 978 最长湍流子数组 题解_第2张图片

有两种特殊情况也需要我们去考虑
一种是数组长度为1,这个比较简单,我们直接判断长度然后返回子数组长度为1即可
还有一种是奇下标和偶下标的值想等,即nums[i]=nums[i+1],当这种情况发生其实也是记作是改变l和r的,只是一开始我没有考虑到,导致有些测试集出现了错误。

当然,既然第一种情况能做出来了,第二种情况其实也同理,我们只需要改变一下符号即可完成对第二种情况的判断,然后再去取最大的湍流子数组即可

class Solution {
    public int maxTurbulenceSize(int[] arr) {
        int n = arr.length;
        int l=0;
        int r=0;
        int ans = 0;
        if(n==1) return 1;
        for(int i=1;iarr[i-1]){
                l=i;
                r=l;
            }
            if(i%2!=0&&arr[i]>arr[i-1]){
                r++;
            }
            if(i%2!=0&&arr[i]arr[i-1]){
                r++;
            }
            if(i%2==0&&arr[i]arr[i-1]){
                l=i;
                r=l;
            }
            bns = Math.max(bns,r-l+1);
        }

        System.out.println("ans:"+ans+"bns:"+bns);
        return Math.max(ans,bns);
    }
}

这是我的第一版代码,少了判断奇下标和偶下标的值相等

class Solution {
    public int maxTurbulenceSize(int[] arr) {
        int n = arr.length;
        int l = 0, r = 0;
        int ans = 0;
        if (n == 1) return 1;

        // 第一轮:假设偶数位置是上升,奇数位置是下降
        for (int i = 1; i < n; i++) {
            if (i % 2 == 0 && arr[i] < arr[i - 1]) {
                r++;
            } else if (i % 2 == 0 && arr[i] > arr[i - 1]) {
                l = i;
                r = l;
            } else if (i % 2 != 0 && arr[i] > arr[i - 1]) {
                r++;
            } else if (i % 2 != 0 && arr[i] < arr[i - 1]) {
                l = i;
                r = l;
            } else { // arr[i] == arr[i-1]
                l = i;
                r = i;
            }
            ans = Math.max(ans, r - l + 1);
        }

        // 第二轮:假设偶数位置是下降,奇数位置是上升
        int bns = 0;
        l = 0;
        r = 0;
        for (int i = 1; i < n; i++) {
            if (i % 2 == 0 && arr[i] > arr[i - 1]) {
                r++;
            } else if (i % 2 == 0 && arr[i] < arr[i - 1]) {
                l = i;
                r = l;
            } else if (i % 2 != 0 && arr[i] < arr[i - 1]) {
                r++;
            } else if (i % 2 != 0 && arr[i] > arr[i - 1]) {
                l = i;
                r = l;
            } else {
                l = i;
                r = i;
            }
            bns = Math.max(bns, r - l + 1);
        }

        // System.out.println("ans:" + ans + " bns:" + bns);
        return Math.max(ans, bns);
    }
}

还有就是祝大家今天的五一假期能好好休息,快快乐乐。

你可能感兴趣的:(算法,leetcode,算法,数据结构)