題目鏈接:376. 擺動序列 - 力扣(LeetCode)
代碼:
class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int curdiff = 0;int prediff = 0;int result = 1; for(int i = 0;i < nums.size()-1;i++){curdiff = nums[i+1] - nums[i];if((prediff <= 0 && curdiff > 0) || (prediff >= 0 && curdiff < 0)){result++;prediff = curdiff;}}return result;}
};
將整個序列抽象到坐標軸上,這里指的擺動也就是坐標軸上的極值
統計到所有極值的個數,則為答案的擺動數。
符合極值的條件:prediff和curdiff相反
但有細節處理需要注意:
-有平坡的情況:只記錄一個,靠右或者靠左,引入了=的情況(靠左:curdiff == 0,靠右:prediff == 0)
-只有兩個數:因為這里的判斷需要三個數才能完成,i,i-1,i+1,默認prediff=0(模擬第一個數a前還有一個數a,對于后面判斷,兩個數就會判斷成兩個極值)
-單調區間有平坡:在只有擺動變化的時候更新prediff,不然prediff =0,curdiff>0的時候記錄一次,中間平坡,prediff變化,prediff = 0,curdiff>0的時候記錄一次,最后prediff>0,curdiff<0的時候記錄一次,中間就重復了,但中間的位置實際是prediff>0,curdiff>0,由于相同數值的情況,prediff更新為0,導致這種情況也被算成了一個極值,是錯誤的,所以只在有擺動的地方,在記錄pre