文章目錄
- 前言
- 題目解析
- 算法原理
- 代碼示例
- 策略證明
前言
題目的鏈接,大家可以先試著去做一下再來看一下思路。376. 擺動序列 - 力扣(LeetCode)
題目解析
將題目有用的信息劃出來,結合示例認真閱讀,去理解題目。
我們的擺動序列可能不是唯一的,但是我們只需要返回最長子序列的長的就ok了,像題目里面給的示例2就有這種情況,紫色劃線組成的數組的最長子序列是7,但是藍色劃線的數組成的最長子序列的長度也是7。
所以我們一定要認真看題目給的示例,然后去挖掘一下題目給的示例沒有的情況。
算法原理
代碼示例
class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int n=nums.size();if(n<2) return n;//首先去處理特殊情況,就是數組中數只有一個的情況int ret = 0, left= 0;//ret用表示最長子序列的長度,left表示某點左側鄰域是遞增還是遞減。for(int i=0; i<n-1; i++)//我們這里不用判斷最后一個數,因為最后一個點我們是一定要選的,所以返回時ret要加一。{int right=nums[i+1]-nums[i];//算出該點右側鄰域是遞增還是遞減。if(right==0) continue;//這里時判斷右側點的值是否與當前點的值相等。if(right*left<=0) ret++;left=right;//將right的值賦給left,當i到當前點的下一個點的時候,此時的left則是下一個點左側鄰域的遞增減情況。}return ret+1;}
};
策略證明
證明方法:反證法