376. Wiggle Subsequence(LeetCode)摇摆序列长度问题

问题描述:

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.
例如,[1,7,4,9,2,5] 是一个摆动序列,因为差值(6,-3,5,-7,3)正负交替。反例, [1,4,7,2,5] 以及 [1,7,4,5,5] 不是摆动序列,第一个是因为前两个差值连续为正,第二个是因为最后一个差值是0。

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

Chanllenge:

Can you do it in O(n) time?

解题思路:
  • 第一次了解状态机(一般大于三个状态的时候使用状态机记录状态比较有效)。

将上升状态和下降状态进行叠加,而且每次取叠加序列的最后一个元素,因为在概率上:有更大的可能性和后面的序列构成摇摆序列。

376. Wiggle Subsequence(LeetCode)摇摆序列长度问题_第1张图片
算法思路
class Solution(object):
    def wiggleMaxLength(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) < 2:
            return len(nums)
        
        length = []
        length.append(nums[0]) 
        up = None
        for i in range(1, len(nums)):
            
            if nums[i-1] < nums[i] and (up == None or up == True):#判断拐点
                length.append(nums[i])
                up = False
            
            if nums[i-1] > nums[i] and (up == None or up == False):
                length.append(nums[i])
                up = True
                
        return len(length)
        

你可能感兴趣的:(376. Wiggle Subsequence(LeetCode)摇摆序列长度问题)