leetcode 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) 时间复杂度完成此题?
分析:
题目的思路很简单,只要贪就行了,从开始记录第一个差,然后每有一个差就判断和原来的一不一样,也就是n-1和n差小于0,如果n和n+1差大于零的话,就把最大值加一,否则不进行操作。
有的同学可能会问为什么从第一个差值开始算起,后面出现变化了怎么办?
那么假设第一个差值是正,第二个差值是负(如果第二个也是正那就没有必要举例了,因为一定不会大于从第一个开始算),找到第一个差值为负之后的后面的摆动序列就是一样的。
那么找到第一个差值为负的数字和最开始第二个差值之间如果没有正值,这个时候就是第一个差值摆动序列最小的时候,而这个时候从第二个差值到之后找到的第一个负值之间是没有摆动序列的。所以不管怎么样,都一定不会大于从第一个开始计算的。
代码:
1 class Solution { 2 public int wiggleMaxLength(int[] nums) { 3 if(nums.length<2) 4 return nums.length; 5 int len=1; 6 boolean is=false,beg=false; 7 for(int n=0;n<nums.length-1;++n) { 8 if(nums[n]==nums[n+1]) 9 continue; 10 else { 11 if(!beg) { 12 beg=true; 13 is=nums[n]-nums[n+1]>0; 14 len++; 15 }else if(nums[n]!=nums[n+1]&&nums[n]-nums[n+1]>0!=is) { 16 is=nums[n]-nums[n+1]>0; 17 len++; 18 } 19 } 20 } 21 return len; 22 } 23 }