zoukankan      html  css  js  c++  java
  • 376. 摆动序列

    376. 摆动序列

    描述:

    如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。

    例如,[1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3)是正负交替出现的。相反, [1,4,7,2,5]和[1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

    给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

    示例 1:

    输入: [1,7,4,9,2,5]
    输出: 6
    解释: 整个序列均为摆动序列。
    示例 2:

    输入: [1,17,5,10,13,15,10,5,16,8]
    输出: 7
    解释: 这个序列包含几个长度为 7 摆动序列,其中一个可为[1,17,10,13,10,16,8]。
    示例 3:

    输入: [1,2,3,4,5,6,7,8,9]
    输出: 2
    进阶:
    你能否用O(n) 时间复杂度完成此题?

     1 解法1:4 ms    8.7 MB
     2 class Solution {
     3 public:
     4     int wiggleMaxLength(vector<int>& nums) {
     5         /*思路:
     6             1:这些序列,如果是递增的,那么保留最大的一个1,2,3,4..9  ->9
     7             2:这些序列入是递减的 ,9,8,5,2,1,那么保留保留最小的一个
     8             3:返回序列长度
     9         */
    10         if(nums.size()<2) return nums.size();//少于两个元素的序列也是摆动序列
    11         
    12         int cnt=1;
    13         int pre=0,cur=0;
    14         for(int i=1;i<nums.size();i++){
    15             if(nums[i]!=nums[i-1]){//跳过相等的 数
    16                 if(nums[i]>nums[i-1])//只要当前 大于 前一个 
    17                     cur=1;//状态标记为1
    18                 else cur=-1;//否则 状态标记为-1
    19                 if(cur!=pre) cnt+=1;//如果 当前的状态 和 前一个状态 不同 序列长度+1
    20                 pre=cur;//更新 先前状态 为 现在的状态,现在状态 下个循环更新
    21             }
    22         }
    23         return cnt;
    24     }
    25 };
     1 解法2:4 ms    8.6 MB
     2 
     3 class Solution {
     4 public:
     5     int wiggleMaxLength(vector<int>& nums) {
     6         /*思路:
     7            1:动态规划 解法
     8            2:bottom 和up  都代表了 当前 的 最长 摆动序列;初始化为1
     9            3:如果 nums[i]>nums[i-1]  那么 前面一个数 处在 低的位置 i-1
    10            4: 此刻 bottom表示这个位置的从 头到 这个 低的位置i-1的 最长 摆动序列长度
    11            5:满足条件了,那么 bottom+1就是 i位置的 最长 摆动序列
    12            6:如果nums[i]<nums[i-1]  那么 前面一个数 处在 低的位置 i-1
    13            7:  此刻up 表示这个位置的从 头到 这个 高的位置i-1的 最长 摆动序列长度
    14            8:满足条件了,那么 up+1就是 i位置的 最长 摆动序列
    15            9:相等的不考虑
    16         */
    17         if(nums.size()<2) return nums.size();//少于两个元素的序列也是摆动序列
    18         int bottom=1,up=1;//动态规划的优化
    19         for(int i=1;i<nums.size();i++){
    20             if(nums[i]>nums[i-1]) up=bottom+1;
    21             else if(nums[i]<nums[i-1]) bottom=up+1;
    22         }
    23         return max(up,bottom);
    24     }
    25 };

     

  • 相关阅读:
    解决运行vue项目的报错This relative module was not found:
    Iterator 迭代器
    Strategy 策略模式
    Observer 观察者
    工厂模式总结(简单工厂,工厂方法,抽象工厂)
    Abstract Factory 抽象工厂
    Factroy 简单工厂
    Singleton 多线程
    Singleton 单例模式
    设计模式总结
  • 原文地址:https://www.cnblogs.com/NirobertEinteson/p/12021847.html
Copyright © 2011-2022 走看看