1. 程式人生 > 其它 >0376-擺動序列

0376-擺動序列

如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為 擺動序列 。第一個差(如果存在的話)可能是正數或負數。僅有一個元素或者含兩個不等元素的序列也視作擺動序列。

  • 例如,[1, 7, 4, 9, 2, 5] 是一個 擺動序列 ,因為差值 (6, -3, 5, -7, 3)是正負交替出現的。

  • 相反,[1, 4, 7, 2, 5]和[1, 7, 4, 5, 5] 不是擺動序列,第一個序列是因為它的前兩個差值都是正數,第二個序列是因為它的最後一個差值為零。
    子序列 可以通過從原始序列中刪除一些(也可以不刪除)元素來獲得,剩下的元素保持其原始順序。

給你一個整數陣列 nums ,返回 nums 中作為 擺動序列 的 最長子序列的長度 。

示例 1:

輸入:nums = [1,7,4,9,2,5]
輸出:6
解釋:整個序列均為擺動序列,各元素之間的差值為 (6, -3, 5, -7, 3) 。
示例 2:

輸入:nums = [1,17,5,10,13,15,10,5,16,8]
輸出:7
解釋:這個序列包含幾個長度為 7 擺動序列。
其中一個是 [1, 17, 10, 13, 10, 16, 8] ,各元素之間的差值為 (16, -7, 3, -3, 6, -8) 。
示例 3:

輸入:nums = [1,2,3,4,5,6,7,8,9]
輸出:2

提示:

1 <= nums.length <= 1000
0 <= nums[i] <= 1000

進階:你能否用O(n) 時間複雜度完成此題?

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/wiggle-subsequence

參考:

python

# 0376.擺動序列

class Solution:
    def wiggleMaxLength(self, nums: [int]) -> int:
        """
        貪心演算法,擺動序列,波動區間,保持鋸齒向前伸展(自創)
        preDiff, curDiff表示當前數值與前個元素的差值及當前數值與後一個元素的差值
        在不斷遍歷中,只有當preDiff及curDiff異號時,說明當前元素是區域性波峰波谷,此時res++
        當元素個數為1時,不進入迴圈,直接返回res的初始值,僅當nums長度大於等於2時,才進入for loop
        :param nums:
        :return:
        """
        preDiff, curDiff, res = 0, 0, 1
        for i in range(len(nums)-1):
            curDiff = nums[i+1] - nums[i]
            if preDiff*curDiff <= 0 and curDiff != 0:
                res += 1
                preDiff = curDiff
        return res

goalng

package greedy

// 貪心演算法-保持鋸齒向前伸展
func wiggleMaxLength(nums []int) int {
	var count, preDiff, curDiff int
	count = 1
	if len(nums) < 2 {
		return count
	}
	for i:=0;i<len(nums)-1;i++ {
		curDiff = nums[i+1] - nums[i]
		if curDiff*preDiff <= 0 && curDiff != 0 {
			preDiff = curDiff
			count++
		}
	}
	return count
}