LeetCode 978 最长湍流子数组 题解
这个题的思路非常简单,只是我的代码没有优化,用的时间复杂度是o(n+n)
,所以其实还好,给大家说说我的思路,对于本题,我们先研究第一种情况,我们可以通过双下标对其进行维护,再更新l和r
下标的同时还能找出最长的湍流子数组的长度,然后就是去优化一些存在的问题即可
有两种特殊情况也需要我们去考虑
一种是数组长度为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;i<n;i++){if(i%2==0&&arr[i]<arr[i-1]){r++;}if(i%2==0&&arr[i]>arr[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]){l=i;r=l;}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++;}if(i%2==0&&arr[i]<arr[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]){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);}
}
还有就是祝大家今天的五一假期能好好休息,快快乐乐。