1. 程式人生 > 其它 >【LeetCode】376. 擺動序列

【LeetCode】376. 擺動序列

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

解法一:貪心

這是道貪心的問題,但是自己確實感覺不好想,貪的是什麼呢,貪的是上升就上升到最高,下降就下降到最低

。要是是在山坡上的值那就不要了,這樣在最後獲得擺動子序列是最長的。所以可以定義之前的變化趨勢是上升還是下降,然後現在的變化趨勢是上升還是下降,如果不一樣那就加1,並且更新當前趨勢,直到遍歷結束。

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;
    }
}