如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為擺動序列。第乙個差(如果存在的話)可能是正數或負數。少於兩個元素的序列也是擺動序列。
例如, [1,7,4,9,2,5] 是乙個擺動序列,因為差值 (6,-3,5,-7,3) 是正負交替出現的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是擺動序列,第乙個序列是因為它的前兩個差值都是正數,第二個序列是因為它的最後乙個差值為零。
給定乙個整數序列,返回作為擺動序列的最長子序列的長度。 通過從原始序列中刪除一些(也可以不刪除)元素來獲得子串行,剩下的元素保持其原始順序。
原題思路:貪心
觀察這個序列可以發現,我們不斷地交錯選擇「峰」與「谷」,可以使得該序列盡可能長。證明非常簡單:如果我們選擇了乙個「過渡元素」,那麼在原序列中,這個「過渡元素」的兩側有乙個「峰」和乙個「谷」。不失一般性,我們假設在原序列中的出現順序為「峰」「過渡元素」「谷」。如果「過渡元素」在選擇的序列中小於其兩側的元素,那麼「谷」一定沒有在選擇的序列**現,我們可以將「過渡元素」替換成「谷」;同理,如果「過渡元素」在選擇的序列中大於其兩側的元素,那麼「峰」一定沒有在選擇的序列**現,我們可以將「過渡元素」替換成「峰」。這樣一來,我們總可以將任意滿足要求的序列中的所有「過渡元素」替換成「峰」或「谷」。並且由於我們不斷地交錯選擇「峰」與「谷」的方法就可以滿足要求,因此這種選擇方法就一定可以達到可選元素數量的最大值。
這樣,我們只需要統計該序列中「峰」與「谷」的數量即可(注意序列兩端的數也是「峰」或「谷」),但需要注意處理相鄰的相同元素。
在實際**中,我們記錄當前序列的上公升下降趨勢。每次加入乙個新元素時,用新的上公升下降趨勢與之前對比,如果出現了「峰」或「谷」,答案加一,並更新當前序列的上公升下降趨勢。
class
solution
int prevdiff = nums[1]
- nums[0]
;int ret = prevdiff !=0?
2:1;
for(
int i =
2; i < n; i++)}
return ret;}}
;
每日一題 力扣376 擺動序列
如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為擺動序列。第乙個差 如果存在的話 可能是正數或負數。少於兩個元素的序列也是擺動序列。例如,1,7,4,9,2,5 是乙個擺動序列,因為差值 6,3,5,7,3 是正負交替出現的。相反,1,4,7,2,5 和 1,7,4,5,5 不是擺動序...
每日一題 leetcode 376 擺動序列
難度中等251 如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為擺動序列。第乙個差 如果存在的話 可能是正數或負數。少於兩個元素的序列也是擺動序列。例如,1,7,4,9,2,5 是乙個擺動序列,因為差值 6,3,5,7,3 是正負交替出現的。相反,1,4,7,2,5 和 1,7,4,5...
力扣刷題筆記 376 擺動序列
題目 376.擺動序列 如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為擺動序列。第乙個差 如果存在的話 可能是正數或負數。少於兩個元素的序列也是擺動序列。例如,1,7,4,9,2,5 是乙個擺動序列,因為差值 6,3,5,7,3 是正負交替出現的。相反,1,4,7,2,5 和 1,7...