leetcode-376 摆动序列
如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為擺動序列。第一個差(如果存在的話)可能是正數或負數。少于兩個元素的序列也是擺動序列。
例如, [1,7,4,9,2,5] 是一個擺動序列,因為差值 (6,-3,5,-7,3) 是正負交替出現的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是擺動序列,第一個序列是因為它的前兩個差值都是正數,第二個序列是因為它的最后一個差值為零。
給定一個整數序列,返回作為擺動序列的最長子序列的長度。 通過從原始序列中刪除一些(也可以不刪除)元素來獲得子序列,剩下的元素保持其原始順序。
示例 1:
輸入: [1,7,4,9,2,5]
輸出: 6
解釋: 整個序列均為擺動序列。
示例 2:
輸入: [1,17,5,10,13,15,10,5,16,8]
輸出: 7 解釋: 這個序列包含幾個長度為 7
擺動序列,其中一個可為[1,17,10,13,10,16,8]。
方法一:一次遍歷
使用兩個變量,保存當前狀態和上一個狀態:curr,prev;
遞增和遞減 數值不同,只有當前狀態curr和上一個狀態prev數值不等時才能說明是一個擺動序列,則 擺動序列長度增加
實現如下:
int wiggleMaxLength(vector<int>& nums) {if (nums.size() < 2) {return nums.size();}int i;int res = 1;int prev = 0;for (i = 1; i < nums.size(); ++i) {if (nums[i] == nums[i-1]) {continue;}int curr = (nums[i]> nums[i-1]) ? 1 : -1;if (curr != prev) {res ++;} prev = curr;}return res;
}
方法二:動態規劃
使用兩個狀態:up,down
up代表當前元素nums[i]結尾的最長搖擺序列,需滿足遞增條件;
down代表當前元素nums[i]結尾的最長搖擺序列,需滿足遞減條件;
最終的結果僅需要取兩個狀態中最大的即為最長的搖擺序列
實現如下:
int wiggleMaxLength(vector<int>& nums) {if (nums.size() < 2) {return nums.size();}int down = 1, up = 1;for (int i = 1; i < nums.size(); i++) {//此時是遞增狀態,那么需在上一個遞減狀態的最大值基礎上加1if (nums[i] > nums[i - 1]) up = down + 1;//此時是遞減狀態,那么需在上一個遞增狀態的最大值基礎上加1else if (nums[i] < nums[i - 1])down = up + 1;}return std::max(down, up);
}
總結
以上是生活随笔為你收集整理的leetcode-376 摆动序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode-455 分发饼干
- 下一篇: 银饰多少钱啊?