zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    0401-服务注册与发现、Eureka简介
    001-OSI七层模型,TCP/IP五层模型
    云原生应用开发12-Factors
    0301-服务提供者与服务消费者
    0201-开始使用Spring Cloud实战微服务准备工作
    0107-将Monolith重构为微服务
    0106-选择微服务部署策略
    0105-微服务的事件驱动的数据管理
    0104-微服务体系结构中的服务发现
    0103-微服务架构中的进程间通信
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13024479.html
Copyright © 2011-2022 走看看