Leetcode 376. 摆动序列 解题思路及C++实现
生活随笔
收集整理的這篇文章主要介紹了
Leetcode 376. 摆动序列 解题思路及C++实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
解題思路:
使用貪心算法的思想。
在例子 [1,17,5,10,13,15,10,5,16,8]中,[1, 17]、[17, 5]這前面的兩個序列就直接都選擇了,沒有問題,對于后面[5, 10, 13, 15]這樣的子序列,數值連續增大,則利用貪心的思想選取差值最大的兩個數,即[5, 15],刪除(不選)數字10和13,再往后的序列[15, 10, 5],同理,選擇[15, 5],這樣一次遍歷下來,貪心策略得到的子序列就是最優解對應的一個序列。
下面程序中的大循環是遍歷nums容器(數組)。每一次執行循環體,都進行一次比較操作,然后再看看上一次的差值是否是相反的,如果是相反的,就將結果加1,并設置flag的值。
?
class Solution { public:int wiggleMaxLength(vector<int>& nums) {if(nums.empty()) return 0;int res = 1;int i = 0;int flag = 0; //用于標記前一個差值的正負while(i < nums.size() - 1){if(nums[i] < nums[i + 1]){ //當前差值為正if(flag != 1){ //前一差值不為正,則res加1,且flag置為1,表示差值為正res++;flag = 1;}}else if(nums[i] > nums[i + 1]){ //當前差值為負if(flag != -1){ //前一差值不為負,則res加1,且flag置為-1,表示差值為負res++;flag = -1;}}i++; //指向下一個元素,包括nums[i] == nums[i + 1]的情況}return res;} };?
?
?
總結
以上是生活随笔為你收集整理的Leetcode 376. 摆动序列 解题思路及C++实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode 134. 加油站 解题
- 下一篇: Leetcode 392. 判断子序列