978. Longest Turbulent Subarray

仅供自己学习

 

思路:

1.很明显,又是滑动窗口的题,只要 if判断能满足 ><,或<>就让右指针右移一个元素,并且记录长度 right-left+1。如果不满足则 left = right,再重复上述步骤

 

代码:

 1 class Solution {
 2 public:
 3     int maxTurbulenceSize(vector<int>& arr) {
 4         int left=0,right=0;
 5         int maxlen = 1;
 6         while(right<arr.size()-1){
 7             if(left == right) {
 8                 if(arr[left]==arr[left+1]) left++;
 9                 right++;
10             }
11             else{
12                 if(arr[right]<arr[right+1]&&arr[right-1]>arr[right]) right++;
13                 else if(arr[right]>arr[right+1]&&arr[right-1]<arr[right]) right++;
14                 else left=right;
15             }
16             maxlen = max(maxlen,right-left+1);
17         }
18         return maxlen;
19     }
20 };

 

还有一种动态规划的方法。我们构造出一种定式,当>出现则down=up+1,up设为1,当<出现 up=down+1,down设为1,所以当 ><出现时 down=2,up=3,正好为3个数,当<>出现时 up为2,down为3.如果没有满足<><>或><><则 down up 将仅有一个为2。这样的方法可以相当于相邻的比较符号不同时,用于记录长度的变量也不同,相当于同步交换,意思是 我们把UP用于映射为<, down映射为>,当 >出现,用down=up+1此时用down继承up的值,相当于>出现,down用来记录长度,当<出现,用up记录长度,等效为用记录长度的变量不同来表示相邻的比较符号的不同。

 

代码:

 1 class Solution {
 2 public:
 3     int maxTurbulenceSize(vector<int>& arr) {
 4         int n=arr.size();
 5         int down=1,up=1;
 6         int maxlen=1;
 7         for(int i=1;i<n;++i){
 8             if(arr[i]>arr[i-1]){ up = down+1; down =1;}
 9             else if(arr[i]<arr[i-1]){ down =up+1;up=1;}
10             else{up=down=1;}
11             maxlen = max(maxlen,max(up,down));
12         }
13         return maxlen;
14     }
15 };

 

上一篇:Leetcode 1248 Count Number of Nice Subarrays (统计nice子数组个数) (双指针)


下一篇:[LeetCode] 978. Longest Turbulent Subarray