zoukankan      html  css  js  c++  java
  • LeetCode-Wiggle Subsequence

    A sequence of numbers is called a wiggle sequence if the differences between successive numbers strictly alternate between positive and negative. The first difference (if one exists) may be either positive or negative. A sequence with fewer than two elements is trivially a wiggle sequence.

    For example, [1,7,4,9,2,5] is a wiggle sequence because the differences (6,-3,5,-7,3) are alternately positive and negative. In contrast, [1,4,7,2,5] and [1,7,4,5,5] are not wiggle sequences, the first because its first two differences are positive and the second because its last difference is zero.

    Given a sequence of integers, return the length of the longest subsequence that is a wiggle sequence. A subsequence is obtained by deleting some number of elements (eventually, also zero) from the original sequence, leaving the remaining elements in their original order.

    Examples:

    Input: [1,7,4,9,2,5]
    Output: 6
    The entire sequence is a wiggle sequence.
    
    Input: [1,17,5,10,13,15,10,5,16,8]
    Output: 7
    There are several subsequences that achieve this length. One is [1,17,10,13,10,16,8].
    
    Input: [1,2,3,4,5,6,7,8,9]
    Output: 2
    

    Follow up:
    Can you do it in O(n) time?

    Analysis:

    Not hard, the longest wiggle subsequence is the sequence composed of all polar points. NOTE: be careful with corner cases: equal nums, all equal nums.

    Solution:

     1 public class Solution {
     2     public int getDirect(int curNum, int nextNum){
     3         return (curNum-nextNum)/Math.abs(curNum-nextNum);
     4     }
     5     public int wiggleMaxLength(int[] nums) {
     6         if (nums.length <=1 ) return nums.length;
     7 
     8         int res = 0;
     9         int curInd = 0;
    10         int nextInd = 0;
    11         while (nextInd < nums.length && nums[curInd] == nums[nextInd]) nextInd++;
    12         if (nextInd >= nums.length) return res+1;
    13 
    14         int preDirect = getDirect(nums[nextInd],nums[curInd]);
    15         while (nextInd < nums.length){
    16             int curDirect = getDirect(nums[curInd],nums[nextInd]);
    17             if (curDirect != 0 && curDirect != preDirect){
    18                 res++;
    19                 preDirect = curDirect;
    20             }
    21             curInd++;
    22             while (nextInd < nums.length && nums[curInd] == nums[nextInd]) nextInd++;
    23         }
    24         return res+1;
    25     }
    26 }
  • 相关阅读:
    Java基础教程:对象比较排序
    算法:深度优先搜索
    微信小程序开发:学习笔记[5]——JavaScript脚本
    微信小程序开发:学习笔记[4]——样式布局
    设计模式:学习笔记(8)——装饰器模式
    设计模式:学习笔记(7)——原型模式
    设计模式——单例模式解析
    玩转Android之数据库框架greenDAO3.0使用指南
    Android开发工具——Android Studio调试技巧
    VR开发的烦恼——范围限制
  • 原文地址:https://www.cnblogs.com/lishiblog/p/5714569.html
Copyright © 2011-2022 走看看