978. Longest Turbulent Subarray
Posted habibah-chang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了978. Longest Turbulent Subarray相关的知识,希望对你有一定的参考价值。
问题:
给定数组,求满足锯齿形子数组<连续两两元素的增减关系为:增减依次循环出现>的最大长度。
Example 1: Input: [9,4,2,10,7,8,8,1,9] Output: 5 Explanation: (A[1] > A[2] < A[3] > A[4] < A[5]) Example 2: Input: [4,8,12,16] Output: 2 Example 3: Input: [100] Output: 1 Note: 1 <= A.length <= 40000 0 <= A[i] <= 10^9
解法1:
每次计算相邻两元素之差/之差的绝对值=change
跟上一次的change->incre比较,如果incre*(-1)==change,则满足锯齿增减趋势。
这样的话,在临时的数组长度tmpres:+1
否则的话,计算当前最大res=max(res, tmpres)
同时更新tmpres=2,留用本次计算的趋势change为下一次的参照趋势:incre
但如果此时为水平趋势,不增不减,那么无法留用上次的参照趋势,使tmpres=1,下次先得到第一次的趋势incre。
代码参考:
1 class Solution { 2 public: 3 int maxTurbulenceSize(vector<int>& A) { 4 int incre=1; 5 int res=1, tmpres=1; 6 for(int i=1; i<A.size(); i++){ 7 int change=(A[i]==A[i-1])?0:(A[i]-A[i-1])/abs(A[i]-A[i-1]); 8 if(tmpres==1 || incre*(-1)==change) tmpres++; 9 else { 10 res=max(res, tmpres); 11 tmpres=change==0?1:2; 12 } 13 incre=change; 14 } 15 tmpres=incre==0?1:tmpres; 16 res=max(res, tmpres); 17 return res; 18 } 19 };
解法2:
设置两个变量代表,当前的增减数incre,decre
若 该值>1,即表示上一次趋势为该值的情况,(incre>1:上一次为增,decre>1:上一次为减)
若 该值==1,即表示上一次非该值的情况,(incre=1:上一次非增,为减或平;decre=1:上一次非减,为增或平)
而在判断本次的时候,
如果增:incre=decre+1,更新本次的incre为上一次decre值+1 > 1,同时更新本次decre=1
如果减:decre=incre+1,更新本次的decre为上一次incre值+1 > 1,同时更新本次incre=1
如果平:incre=1,decre=1
每次计算res的最大=max(res, max(incre, decre))
代码参考:
1 class Solution { 2 public: 3 int maxTurbulenceSize(vector<int>& A) { 4 int incre=1, decre=1; 5 int res=1; 6 for(int i=1; i<A.size(); i++){ 7 int p=A[i]-A[i-1]; 8 if(p>0){ 9 incre=decre+1; 10 decre=1; 11 }else if(p<0){ 12 decre=incre+1; 13 incre=1; 14 }else{ 15 incre=1; 16 decre=1; 17 } 18 res=max(res, max(incre, decre)); 19 } 20 return res; 21 } 22 };
以上是关于978. Longest Turbulent Subarray的主要内容,如果未能解决你的问题,请参考以下文章
978. Longest Turbulent Subarray
Leetcode 978. Longest Turbulent Subarray
leecode 978. Longest Turbulent Subarray(最长连续波动序列,DP or 滚动数组)