【LeetCode】376. 擺動序列
阿新 • • 發佈:2021-08-12
376. 擺動序列
知識點:貪心
題目描述
如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為 擺動序列 。第一個差(如果存在的話)可能是正數或負數。僅有一個元素或者含兩個不等元素的序列也視作擺動序列。
例如,[1, 7, 4, 9, 2, 5] 是一個 擺動序列 ,因為差值 (6, -3, 5, -7, 3)是正負交替出現的。
相反,[1, 4, 7, 2, 5]和[1, 7, 4, 5, 5] 不是擺動序列,第一個序列是因為它的前兩個差值都是正數,第二個序列是因為它的最後一個差值為零。
子序列 可以通過從原始序列中刪除一些(也可以不刪除)元素來獲得,剩下的元素保持其原始順序。
給你一個整數陣列 nums ,返回 nums 中作為 擺動序列 的 最長子序列的長度 。
示例
輸入:nums = [1,7,4,9,2,5]
輸出:6
解釋:整個序列均為擺動序列,各元素之間的差值為 (6, -3, 5, -7, 3) 。
輸入: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) 。
輸入:nums = [1,2,3,4,5,6,7,8,9]
輸出:2
解法一:貪心
這是道貪心的問題,但是自己確實感覺不好想,貪的是什麼呢,貪的是上升就上升到最高,下降就下降到最低
class Solution { public int wiggleMaxLength(int[] nums) { int n = nums.length; if(n < 2) return n; //特例; int prediff = nums[1]-nums[0]; //上一步的變化趨勢; int count = prediff == 0 ? 1 : 2; //最後要的是序列長度; for(int i = 2; i < n; i++){ int diff = nums[i] - nums[i-1]; //這次的變化趨勢; if((diff > 0 && prediff <= 0) || (diff < 0 && prediff >= 0)){ count++; //上升的話就上升到最高,只要變化的值,在山坡上的值就不要了; prediff = diff; } } return count; } }