日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

摆动序列-

發(fā)布時間:2024/4/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 摆动序列- 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


本題說可以通過從原始序列中刪除一些(也可以不刪除)元素來獲得子序列,剩下的元素保持其原始順序。

相信這么一說嚇退不少同學,這要求最大擺動序列又可以修改數組,這得如何修改呢?

來分析一下,要求刪除元素使其達到最大擺動序列,應該刪除什么元素呢?

用示例二來舉例,如圖所示:


局部最優(yōu):刪除單調坡度上的節(jié)點(不包括單調坡度兩端的節(jié)點),那么這個坡度就可以有兩個局部峰值」。

整體最優(yōu):整個序列有最多的局部峰值,從而達到最長擺動序列」。

局部最優(yōu)推出全局最優(yōu),并舉不出反例,那么試試貪心!

(為方便表述,以下說的峰值都是指局部峰值)

「實際操作上,其實連刪除的操作都不用做,因為題目要求的是最長擺動子序列的長度,所以只需要統(tǒng)計數組的峰值數量就可以了(相當于是刪除單一坡度上的節(jié)點,然后統(tǒng)計長度)」

「這就是貪心所貪的地方,讓峰值盡可能的保持峰值,然后刪除單一坡度上的節(jié)點」。

本題代碼實現中,還有一些技巧,例如統(tǒng)計峰值的時候,數組最左面和最右面是最不好統(tǒng)計的。

例如序列[2,5],它的峰值數量是2,如果靠統(tǒng)計差值來計算峰值個數就需要考慮數組最左面和最右面的特殊情況。

所以可以針對序列[2,5],可以假設為[2,2,5],這樣它就有坡度了即preDiff = 0,如圖:

針對以上情形,result初始為1(默認最右面有一個峰值),此時curDiff > 0 && preDiff <= 0,那么result++(計算了左面的峰值),最后得到的result就是2(峰值個數為2即擺動序列長度為2)

class Solution { public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() <= 1) return nums.size();int curDiff = 0; // 當前一對差值int preDiff = 0; // 前一對差值int result = 1; // 記錄峰值個數,序列默認序列最右邊有一個峰值for (int i = 1; i < nums.size(); i++) {curDiff = nums[i] - nums[i - 1];// 出現峰值if ((curDiff > 0 && preDiff <= 0) || (preDiff >= 0 && curDiff < 0)) {result++;preDiff = curDiff;}}return result;} };

保持區(qū)間波動,只需要把單調區(qū)間上的元素移除就可以了。

總結

以上是生活随笔為你收集整理的摆动序列-的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。