国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

擺動(dòng)序列,也能貪心

開(kāi)發(fā) 前端
如果連續(xù)數(shù)字之間的差嚴(yán)格地在正數(shù)和負(fù)數(shù)之間交替,則數(shù)字序列稱為擺動(dòng)序列。第一個(gè)差(如果存在的話)可能是正數(shù)或負(fù)數(shù)。少于兩個(gè)元素的序列也是擺動(dòng)序列。

[[434526]]

擺動(dòng)序列

力扣題目鏈接:https://leetcode-cn.com/problems/wiggle-subsequence

如果連續(xù)數(shù)字之間的差嚴(yán)格地在正數(shù)和負(fù)數(shù)之間交替,則數(shù)字序列稱為擺動(dòng)序列。第一個(gè)差(如果存在的話)可能是正數(shù)或負(fù)數(shù)。少于兩個(gè)元素的序列也是擺動(dòng)序列。

例如, [1,7,4,9,2,5] 是一個(gè)擺動(dòng)序列,因?yàn)椴钪?(6,-3,5,-7,3) 是正負(fù)交替出現(xiàn)的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是擺動(dòng)序列,第一個(gè)序列是因?yàn)樗那皟蓚€(gè)差值都是正數(shù),第二個(gè)序列是因?yàn)樗淖詈笠粋€(gè)差值為零。

給定一個(gè)整數(shù)序列,返回作為擺動(dòng)序列的最長(zhǎng)子序列的長(zhǎng)度。通過(guò)從原始序列中刪除一些(也可以不刪除)元素來(lái)獲得子序列,剩下的元素保持其原始順序。

示例 1:

  • 輸入: [1,7,4,9,2,5]
  • 輸出: 6
  • 解釋: 整個(gè)序列均為擺動(dòng)序列。

示例 2:

  • 輸入: [1,17,5,10,13,15,10,5,16,8]
  • 輸出: 7
  • 解釋: 這個(gè)序列包含幾個(gè)長(zhǎng)度為 7 擺動(dòng)序列,其中一個(gè)可為[1,17,10,13,10,16,8]。

示例 3:

  • 輸入: [1,2,3,4,5,6,7,8,9]
  • 輸出: 2

思路1(貪心解法)

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

相信這么一說(shuō)嚇退不少同學(xué),這要求最大擺動(dòng)序列又可以修改數(shù)組,這得如何修改呢?

來(lái)分析一下,要求刪除元素使其達(dá)到最大擺動(dòng)序列,應(yīng)該刪除什么元素呢?

用示例二來(lái)舉例,如圖所示:

擺動(dòng)序列

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

整體最優(yōu):整個(gè)序列有最多的局部峰值,從而達(dá)到最長(zhǎng)擺動(dòng)序列。

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

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

實(shí)際操作上,其實(shí)連刪除的操作都不用做,因?yàn)轭}目要求的是最長(zhǎng)擺動(dòng)子序列的長(zhǎng)度,所以只需要統(tǒng)計(jì)數(shù)組的峰值數(shù)量就可以了(相當(dāng)于是刪除單一坡度上的節(jié)點(diǎn),然后統(tǒng)計(jì)長(zhǎng)度)

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

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

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

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

.擺動(dòng)序列1

針對(duì)以上情形,result初始為1(默認(rèn)最右面有一個(gè)峰值),此時(shí)curDiff > 0 && preDiff <= 0,那么result++(計(jì)算了左面的峰值),最后得到的result就是2(峰值個(gè)數(shù)為2即擺動(dòng)序列長(zhǎng)度為2)

C++代碼如下(和上圖是對(duì)應(yīng)的邏輯):

  1. class Solution { 
  2. public
  3.     int wiggleMaxLength(vector<int>& nums) { 
  4.         if (nums.size() <= 1) return nums.size(); 
  5.         int curDiff = 0; // 當(dāng)前一對(duì)差值 
  6.         int preDiff = 0; // 前一對(duì)差值 
  7.         int result = 1;  // 記錄峰值個(gè)數(shù),序列默認(rèn)序列最右邊有一個(gè)峰值 
  8.         for (int i = 0; i < nums.size() - 1; i++) { 
  9.             curDiff = nums[i + 1] - nums[i]; 
  10.             // 出現(xiàn)峰值 
  11.             if ((curDiff > 0 && preDiff <= 0) || (preDiff >= 0 && curDiff < 0)) { 
  12.                 result++; 
  13.                 preDiff = curDiff; 
  14.             } 
  15.         } 
  16.         return result; 
  17.     } 
  18. }; 

時(shí)間復(fù)雜度O(n) 空間復(fù)雜度O(1)

思路2(動(dòng)態(tài)規(guī)劃)

考慮用動(dòng)態(tài)規(guī)劃的思想來(lái)解決這個(gè)問(wèn)題。

很容易可以發(fā)現(xiàn),對(duì)于我們當(dāng)前考慮的這個(gè)數(shù),要么是作為山峰(即nums[i] > nums[i-1]),要么是作為山谷(即nums[i] < nums[i - 1])。

  • 設(shè)dp狀態(tài)dp[i][0],表示考慮前i個(gè)數(shù),第i個(gè)數(shù)作為山峰的擺動(dòng)子序列的最長(zhǎng)長(zhǎng)度
  • 設(shè)dp狀態(tài)dp[i][1],表示考慮前i個(gè)數(shù),第i個(gè)數(shù)作為山谷的擺動(dòng)子序列的最長(zhǎng)長(zhǎng)度

則轉(zhuǎn)移方程為:

  • dp[i][0] = max(dp[i][0], dp[j][1] + 1),其中0 < j < i且nums[j] < nums[i],表示將nums[i]接到前面某個(gè)山谷后面,作為山峰。
  • dp[i][1] = max(dp[i][1], dp[j][0] + 1),其中0 < j < i且nums[j] > nums[i],表示將nums[i]接到前面某個(gè)山峰后面,作為山谷。

初始狀態(tài):

由于一個(gè)數(shù)可以接到前面的某個(gè)數(shù)后面,也可以以自身為子序列的起點(diǎn),所以初始狀態(tài)為:dp[0][0] = dp[0][1] = 1。

C++代碼如下:

  1. class Solution { 
  2. public
  3.     int dp[1005][2]; 
  4.     int wiggleMaxLength(vector<int>& nums) { 
  5.         memset(dp, 0, sizeof dp); 
  6.         dp[0][0] = dp[0][1] = 1; 
  7.  
  8.         for (int i = 1; i < nums.size(); ++i) 
  9.         { 
  10.             dp[i][0] = dp[i][1] = 1; 
  11.  
  12.             for (int j = 0; j < i; ++j) 
  13.             { 
  14.                 if (nums[j] > nums[i]) dp[i][1] = max(dp[i][1], dp[j][0] + 1); 
  15.             } 
  16.  
  17.             for (int j = 0; j < i; ++j) 
  18.             { 
  19.                 if (nums[j] < nums[i]) dp[i][0] = max(dp[i][0], dp[j][1] + 1); 
  20.             } 
  21.         } 
  22.         return max(dp[nums.size() - 1][0], dp[nums.size() - 1][1]); 
  23.     } 
  24. }; 
  • 時(shí)間復(fù)雜度O(n^2)
  • 空間復(fù)雜度O(n)

進(jìn)階

可以用兩棵線段樹(shù)來(lái)維護(hù)區(qū)間的最大值

每次更新dp[i][0],則在tree1的nums[i]位置值更新為dp[i][0]

每次更新dp[i][1],則在tree2的nums[i]位置值更新為dp[i][1]

則dp轉(zhuǎn)移方程中就沒(méi)有必要j從0遍歷到i-1,可以直接在線段樹(shù)中查詢指定區(qū)間的值即可。

  • 時(shí)間復(fù)雜度O(nlogn)
  • 空間復(fù)雜度O(n)

總結(jié)

貪心的題目說(shuō)簡(jiǎn)單有的時(shí)候就是常識(shí),說(shuō)難就難在都不知道該怎么用貪心。

本題大家如果要去模擬刪除元素達(dá)到最長(zhǎng)擺動(dòng)子序列的過(guò)程,那指定繞里面去了,一時(shí)半會(huì)拔不出來(lái)。

而這道題目有什么技巧說(shuō)一下子能想到貪心么?

其實(shí)也沒(méi)有,類似的題目做過(guò)了就會(huì)想到。

 

此時(shí)大家就應(yīng)該了解了:保持區(qū)間波動(dòng),只需要把單調(diào)區(qū)間上的元素移除就可以了。

 

責(zé)任編輯:武曉燕 來(lái)源: 代碼隨想錄
相關(guān)推薦

2009-01-18 09:19:00

DHCPVlANIP

2011-07-13 10:32:09

開(kāi)源

2019-04-17 18:04:10

網(wǎng)卡虛擬化網(wǎng)絡(luò)設(shè)備

2015-10-20 10:57:22

無(wú)線充電無(wú)線技術(shù)

2012-12-20 09:15:29

JVMJVM平臺(tái)JVM技術(shù)

2014-06-24 09:24:24

密碼身份驗(yàn)證

2009-12-25 10:07:38

Linux系統(tǒng)多點(diǎn)觸摸

2022-02-10 08:07:41

機(jī)器學(xué)習(xí)低代碼開(kāi)發(fā)

2012-12-20 09:41:49

JVMJava

2021-12-27 07:45:30

CSS 技巧煙霧效果

2021-03-26 10:02:29

PythonVIP視頻看電影

2023-06-26 07:51:48

2018-01-26 09:01:16

對(duì)象存儲(chǔ)Java

2019-07-09 08:44:00

DeepfakeGAN人工智能

2025-04-14 00:00:00

MCPjson 信息地理編碼

2017-08-14 16:36:23

ASActivity內(nèi)存

2021-08-04 09:00:53

Python數(shù)據(jù)庫(kù)Python基礎(chǔ)

2010-09-02 17:31:42

VisualStudi微軟flash

2025-02-10 11:11:47

2021-08-02 09:01:29

PythonMySQL 數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美精品久久99久久在免费线| 亚洲石原莉奈一区二区在线观看| 日本在线视频一区| 91精品国产成人观看| 午夜精品理论片| 亚洲狼人综合| 日韩av在线电影网| 丝袜国产在线| a中文在线播放| 亚洲第一综合色| 国产一区在线播放| 成人黄色激情网站| 丝袜美腿玉足3d专区一区| 欧美大片黄色| 国产精品乱人伦中文| 国产裸体写真av一区二区 | 麻豆极品一区二区三区| 国产精品福利久久久| 日韩中文字幕无砖| 欧美大尺度在线观看| 日本免费一区二区三区等视频| 亚洲色图15p| 99亚洲伊人久久精品影院| 一区二区欧美在线| 精品成人18| 欧美高清视频免费观看| 国产精品中文字幕制服诱惑| 欧美一级片免费在线| 久久爱www成人| 国产综合久久久久久| 影音先锋日韩在线| 欧美日韩国产三区| 麻豆视频一区二区| 久草视频这里只有精品| 99久久久精品免费观看国产蜜| 农村妇女精品一二区| 日韩理论在线观看| 经典三级在线| 欧美精品一区二区三区很污很色的 | 日本久久精品| 91文字幕巨乱亚洲香蕉| 国产一区成人| 男人的天堂视频在线| 国产欧美日韩亚州综合| 黄动漫在线免费观看| 欧美日韩成人综合| 国产免费不卡| 久久久久久久久久久久av| 999久久久精品国产| 亚洲成人午夜在线| 中文字幕国产一区二区| 黄色片在线免费观看| 亚洲福利在线播放| 成人盗摄视频| 久久99精品久久久久久久青青日本 | 国产精品一区一区| 成人www视频网站免费观看| 色综合久久88色综合天天| cao在线视频| 欧美在线免费视频| 视频在线观看一区二区三区| 欧美污视频网站| 欧美日韩一区二区三区四区| 日韩专区视频| 国产一区二区视频在线免费观看| 国产老女人精品毛片久久| 22288色视频在线观看| 精品日产卡一卡二卡麻豆| 第四色中文综合网| 日本一区不卡| 亚洲女人小视频在线观看| 91豆花视频在线播放| 国产精品久久久久久久一区探花| 蜜桃视频第一区免费观看| 黄色网址三级| 一区二区三区黄色| 久久中文字幕二区| 免费人成在线观看视频播放| 狠狠综合久久av一区二区小说| av一区在线播放| 国产专区一区二区三区| 一区在线播放视频| 午夜欧美巨大性欧美巨大 | 亚洲国产精品嫩草影院久久av| 美日韩免费视频| 亚洲欧美韩国综合色| 都市激情亚洲一区| 亚洲综合视频1区| 国产精品亲子伦对白| 成人欧美一区二区三区的电影| 91在线精品观看| 国产精品日韩成人| abab456成人免费网址| 欧美日韩亚洲一区二区三区四区| 亚洲综合一二区| 在线免费观看亚洲| 亚洲区一区二区三区| 色综合 综合色| 欧美欧美黄在线二区| 5月婷婷6月丁香| 精品国产3级a| 日韩天天综合| 天堂a√中文在线| 久久久最新网址| 久久只精品国产| 亚洲日本在线观看视频| 日本欧美色综合网站免费| 一本大道久久a久久精二百 | 番号在线播放| 国产精品视频免费在线| 26uuu国产一区二区三区| xxxx在线视频| 欧美高清性xxxxhd| 欧美午夜片在线看| 91精品国产自产拍在线观看蜜| 无需播放器的av| 欧美大学生性色视频| 91在线观看一区二区| 天然素人一区二区视频| 天天成人综合网| 亚洲精品国产欧美| 免费日韩视频| 免费av网站在线观看| 国产精品一区二区三区精品 | 久久亚洲美女| 国产美女在线观看| 麻豆91蜜桃| 日韩欧美国产一二三区| 亚洲一区二区伦理| 黄色在线播放网站| 婷婷久久伊人| 亚洲精品wwwww| 国内精品视频666| 老司机成人影院| 偷拍盗摄高潮叫床对白清晰| 亚洲国产日韩欧美综合久久| 精品一区二区三区免费观看 | 丰满的少妇愉情hd高清果冻传媒 | 成人白浆超碰人人人人| 日日夜夜天天综合| 精品无码国产一区二区三区av| 国产亚洲人成网站在线观看| 成人综合激情网| 免费看日产一区二区三区| 国产精品亚洲a| 97av在线视频免费播放| 一区二区三区四区在线播放| 日韩欧美1区| aiai在线| 亚洲AV无码成人精品一区| 亚洲人成欧美中文字幕| 久久综合久久鬼色| 国产一区二区三区天码| 国产区在线视频| 亚洲欧洲日本国产| 久久网福利资源网站| 亚洲欧美日韩电影| 欧美视频福利| 亚洲三级欧美| 五月婷婷激情久久| 国产欧美一区二区三区四区| 欧美精品第1页| 国产乱码一区二区三区| 久久国产精品色av免费看| 你懂的视频在线观看| 亚洲一区不卡在线| 欧美黑人巨大精品一区二区| 欧美日韩在线影院| 精品一区二区免费视频| 草草视频在线一区二区| 国自产拍在线网站网址视频| 一区二区视频国产| 韩国一区二区电影| 色哟哟精品一区| 懂色中文一区二区在线播放| 猛男gaygay欧美视频| h片在线观看网站| 99精品免费在线观看| 国产精品免费一区二区三区在线观看 | 日本久久久久久久久久久久| 91在线免费网站| 亚洲男人的天堂在线播放| 中文字幕亚洲综合久久菠萝蜜| 午夜性色一区二区三区免费视频 | 九热视频在线观看| www.成人三级视频| 色狠狠av一区二区三区香蕉蜜桃| 亚洲国产精品久久久久婷婷884| 蜜桃视频在线一区| 奇米亚洲欧美| 女厕盗摄一区二区三区| 亚洲精品第一国产综合野草社区| 亚洲国产欧美一区二区三区不卡| 国内精品一区二区三区四区| 日韩视频一区在线观看| 国产喂奶挤奶一区二区三区| 国产精品视频| 欧美日韩高清| 久久电影天堂| 黄色成人影院|