仅供自己学习
思路:
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 };