0376-擺動序列
阿新 • • 發佈:2021-11-24
如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為 擺動序列 。第一個差(如果存在的話)可能是正數或負數。僅有一個元素或者含兩個不等元素的序列也視作擺動序列。
-
例如,[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
}