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 滚动数组)

Longest Increasing Sequence

python之列表

html 学习资料列表