精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

遞增子序列,有點難度!

開發 前端
本題題解清一色都說是深度優先搜索,但我更傾向于說它用回溯法,而且本題我也是完全使用回溯法的邏輯來分析的。

[[427757]]

給定一個整型數組, 你的任務是找到所有該數組的遞增子序列,遞增子序列的長度至少是2。

示例:

  • 輸入: [4, 6, 7, 7]
  • 輸出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]

說明:

  • 給定數組的長度不會超過15。
  • 數組中的整數范圍是 [-100,100]。
  • 給定數組中可能包含重復數字,相等的數字應該被視為遞增的一種情況。

思路

這個遞增子序列比較像是取有序的子集。而且本題也要求不能有相同的遞增子序列。

這又是子集,又是去重,是不是不由自主的想起了剛剛講過的90.子集II。

就是因為太像了,更要注意差別所在,要不就掉坑里了!

在90.子集II中我們是通過排序,再加一個標記數組來達到去重的目的。

而本題求自增子序列,是不能對原數組經行排序的,排完序的數組都是自增子序列了。

所以不能使用之前的去重邏輯!

本題給出的示例,還是一個有序數組 [4, 6, 7, 7],這更容易誤導大家按照排序的思路去做了。

為了有鮮明的對比,我用[4, 7, 6, 7]這個數組來舉例,抽象為樹形結構如圖:

遞增子序列1

回溯三部曲

  • 遞歸函數參數

本題求子序列,很明顯一個元素不能重復使用,所以需要startIndex,調整下一層遞歸的起始位置。

代碼如下:

  1. vector<vector<int>> result; 
  2. vector<int> path; 
  3. void backtracking(vector<int>& nums, int startIndex) 
  • 終止條件

本題其實類似求子集問題,也是要遍歷樹形結構找每一個節點,所以和回溯算法:求子集問題!一樣,可以不加終止條件,startIndex每次都會加1,并不會無限遞歸。

但本題收集結果有所不同,題目要求遞增子序列大小至少為2,所以代碼如下:

  1. if (path.size() > 1) { 
  2.     result.push_back(path); 
  3.     // 注意這里不要加return,因為要取樹上的所有節點 
  • 單層搜索邏輯

在圖中可以看出,同一父節點下的同層上使用過的元素就不能在使用了

那么單層搜索代碼如下:

  1. unordered_set<int> uset; // 使用set來對本層元素進行去重 
  2. for (int i = startIndex; i < nums.size(); i++) { 
  3.     if ((!path.empty() && nums[i] < path.back()) 
  4.             || uset.find(nums[i]) != uset.end()) { 
  5.             continue
  6.     } 
  7.     uset.insert(nums[i]); // 記錄這個元素在本層用過了,本層后面不能再用了 
  8.     path.push_back(nums[i]); 
  9.     backtracking(nums, i + 1); 
  10.     path.pop_back(); 

對于已經習慣寫回溯的同學,看到遞歸函數上面的uset.insert(nums[i]);,下面卻沒有對應的pop之類的操作,應該很不習慣吧,哈哈

這也是需要注意的點,unordered_set uset; 是記錄本層元素是否重復使用,新的一層uset都會重新定義(清空),所以要知道uset只負責本層!

最后整體C++代碼如下:

  1. // 版本一 
  2. class Solution { 
  3. private: 
  4.     vector<vector<int>> result; 
  5.     vector<int> path; 
  6.     void backtracking(vector<int>& nums, int startIndex) { 
  7.         if (path.size() > 1) { 
  8.             result.push_back(path); 
  9.             // 注意這里不要加return,要取樹上的節點 
  10.         } 
  11.         unordered_set<int> uset; // 使用set對本層元素進行去重 
  12.         for (int i = startIndex; i < nums.size(); i++) { 
  13.             if ((!path.empty() && nums[i] < path.back()) 
  14.                     || uset.find(nums[i]) != uset.end()) { 
  15.                     continue
  16.             } 
  17.             uset.insert(nums[i]); // 記錄這個元素在本層用過了,本層后面不能再用了 
  18.             path.push_back(nums[i]); 
  19.             backtracking(nums, i + 1); 
  20.             path.pop_back(); 
  21.         } 
  22.     } 
  23. public
  24.     vector<vector<int>> findSubsequences(vector<int>& nums) { 
  25.         result.clear(); 
  26.         path.clear(); 
  27.         backtracking(nums, 0); 
  28.         return result; 
  29.     } 
  30. }; 

優化

以上代碼用我用了unordered_set來記錄本層元素是否重復使用。

其實用數組來做哈希,效率就高了很多。

注意題目中說了,數值范圍[-100,100],所以完全可以用數組來做哈希。

程序運行的時候對unordered_set 頻繁的insert,unordered_set需要做哈希映射(也就是把key通過hash function映射為唯一的哈希值)相對費時間,而且每次重新定義set,insert的時候其底層的符號表也要做相應的擴充,也是費事的。

那么優化后的代碼如下:

  1. // 版本二 
  2. class Solution { 
  3. private: 
  4.     vector<vector<int>> result; 
  5.     vector<int> path; 
  6.     void backtracking(vector<int>& nums, int startIndex) { 
  7.         if (path.size() > 1) { 
  8.             result.push_back(path); 
  9.         } 
  10.         int used[201] = {0}; // 這里使用數組來進行去重操作,題目說數值范圍[-100, 100] 
  11.         for (int i = startIndex; i < nums.size(); i++) { 
  12.             if ((!path.empty() && nums[i] < path.back()) 
  13.                     || used[nums[i] + 100] == 1) { 
  14.                     continue
  15.             } 
  16.             used[nums[i] + 100] = 1; // 記錄這個元素在本層用過了,本層后面不能再用了 
  17.             path.push_back(nums[i]); 
  18.             backtracking(nums, i + 1); 
  19.             path.pop_back(); 
  20.         } 
  21.     } 
  22. public
  23.     vector<vector<int>> findSubsequences(vector<int>& nums) { 
  24.         result.clear(); 
  25.         path.clear(); 
  26.         backtracking(nums, 0); 
  27.         return result; 
  28.     } 
  29. }; 

這份代碼在leetcode上提交,要比版本一耗時要好的多。

所以正如在哈希表:總結篇!(每逢總結必經典)中說的那樣,數組,set,map都可以做哈希表,而且數組干的活,map和set都能干,但如果數值范圍小的話能用數組盡量用數組。

總結

本題題解清一色都說是深度優先搜索,但我更傾向于說它用回溯法,而且本題我也是完全使用回溯法的邏輯來分析的。

相信大家在本題中處處都能看到是90.子集II的身影,但處處又都是陷阱。

對于養成思維定式或者套模板套嗨了的同學,這道題起到了很好的警醒作用。更重要的是拓展了大家的思路!

就醬,如果感覺「代碼隨想錄」很干貨,就幫Carl宣傳一波吧!

本文轉載自微信公眾號「代碼隨想錄」,可以通過以下二維碼關注。轉載本文請聯系代碼隨想錄公眾號。

 

責任編輯:武曉燕 來源: 代碼隨想錄
相關推薦

2018-10-16 10:51:59

AI招聘算法招聘歧視

2023-07-07 08:24:07

css顏色變量

2021-09-01 07:59:44

HTTPweb瀏覽器

2021-03-09 07:37:41

DHCP協議地址

2021-09-16 18:28:02

二叉樹遍歷遞歸

2012-09-10 09:52:15

開源開源項目開源精神

2024-06-13 10:24:28

2015-05-05 13:50:56

小米華為

2011-11-11 11:28:56

云計算

2021-09-27 09:18:30

分割回文串循環

2012-03-19 20:52:55

小米

2021-08-16 15:54:55

算法比特幣加密貨幣

2012-10-23 16:34:44

蘋果iCloud云應用

2024-08-26 09:36:06

2011-09-01 10:10:06

云計算

2022-02-10 20:09:24

Dubbo源碼Provider

2025-09-22 01:00:00

2022-01-31 13:48:52

低代碼開發軟件

2021-03-11 23:42:15

二叉樹數組排序

2017-06-28 15:34:16

JDK模塊化Java9
點贊
收藏

51CTO技術棧公眾號

人妻少妇偷人精品久久久任期| 91在线国内视频| 日本韩国欧美在线| 亚洲一区二区在| www.五月婷婷| 久久综合五月| 九九久久综合网站| 一级做a爰片毛片| 日韩久久一区| 午夜久久久久久久久久一区二区| 美女精品国产| 国产99久一区二区三区a片| 亚洲精品护士| 两个人的视频www国产精品| 少妇户外露出[11p]| 激情亚洲小说| 亚洲福利电影网| 亚洲ai欧洲av| 五月天婷婷社区| 国产一区二区调教| 国产成人精品在线| 日本一二三区不卡| 国产精品久久久久久久久妇女| 亚洲娇小xxxx欧美娇小| 亚洲制服中文字幕| 日本精品另类| 疯狂做受xxxx高潮欧美日本 | a在线视频观看| 久草资源在线| 国产欧美视频一区二区| 成人黄动漫网站免费| 亚洲在线精品视频| 老司机午夜精品视频在线观看| 欧美激情第三页| 国产成人综合在线视频| 日韩国产专区| 一区二区欧美亚洲| 香蕉网在线播放| 国产精品丝袜在线播放| 欧美精品久久99久久在免费线| 欧美牲交a欧美牲交aⅴ免费真| 黄网在线免费看| 亚洲乱码精品一二三四区日韩在线| 日韩精品资源| 国产在线中文字幕| 久久影院视频免费| 久久国产精品 国产精品| 乱色精品无码一区二区国产盗| 国产一区视频网站| 亚洲va电影大全| 一级黄色大片免费观看| 免费国产亚洲视频| 国产精品久久久久久亚洲影视| 亚洲欧美日韩激情| 久久久久久亚洲精品杨幂换脸| 69视频在线免费观看| 国产尤物在线视频| 免费在线亚洲欧美| 日本三级久久久| 无码人妻丰满熟妇奶水区码| 日韩精品三区四区| 国产精品户外野外| 久草热在线观看| 蜜臀久久99精品久久久久久9| 国产精自产拍久久久久久| 亚洲大尺度在线观看| 日韩va亚洲va欧美va久久| 国产精品xxx视频| 亚洲字幕av一区二区三区四区| 老司机免费视频一区二区| 国产精品爽黄69天堂a| 一本久道久久综合无码中文| 国产在线精品一区在线观看麻豆| 亚洲综合精品一区二区| 亚洲成人av综合| 99久久精品费精品国产一区二区 | 欧美日韩中字| 精品国产区一区二区三区在线观看| 免费黄色激情视频| 欧美在线看片| 66m—66摸成人免费视频| 中文字幕国产在线观看| 日本中文字幕一区二区有限公司| 国产日本欧美在线观看| 国产黄色一区二区| 99久久精品国产一区| 亚洲国产精品一区二区第一页 | 自拍偷在线精品自拍偷无码专区| 欧洲金发美女大战黑人| 91资源在线观看| 在线观看日韩av先锋影音电影院| 欧美视频国产视频| 激情小说亚洲图片| 最新亚洲国产精品| 国产一级片网址| 日韩精品电影一区亚洲| 91精品国产高清久久久久久91裸体| 三级网站免费观看| 国产精品理论片在线观看| 美女黄色免费看| 精品123区| 欧美videos大乳护士334| 免费污网站在线观看| 午夜久久美女| 国产精国产精品| 亚洲精品字幕在线| 欧美激情在线观看视频免费| 91成人综合网| 欧美成人福利| 亚洲精品suv精品一区二区| 波多野结衣家庭教师在线观看| 亚洲清纯自拍| 亚洲xxx自由成熟| 成人在线观看黄色| 亚洲国产日韩a在线播放性色| 亚洲 欧美 另类人妖| 黄色网一区二区| 久久国产精品久久久久久| 波多野结衣一区二区三区四区| 国产不卡在线一区| 2025韩国大尺度电影| 国精产品一区二区三区有限公司| 亚洲第一福利视频| 男女羞羞免费视频| 麻豆精品视频在线| 欧美一区观看| 无遮挡在线观看| 亚洲精品一区二区在线观看| 日韩在线中文字幕视频| 麻豆freexxxx性91精品| 欧美久久久久久久| 狠狠操一区二区三区| 欧美大片拔萝卜| 欧美三级黄色大片| 久久精品国产77777蜜臀| 日本一区不卡| 亚洲第一二三四区| 亚洲欧洲国产伦综合| 亚洲日本韩国在线| www.色综合.com| 国产日本在线播放| 精品视频高潮| 97国产真实伦对白精彩视频8| 精品久久久中文字幕人妻| 亚洲四区在线观看| www激情五月| 一级欧洲+日本+国产| 亚洲va久久久噜噜噜久久天堂| 理论片午午伦夜理片在线播放| 欧美日韩在线播| 青青视频免费在线观看| 亚洲欧美综合自拍| 成人午夜电影久久影院| 日本wwwcom| 国产精品网站在线看| 97久久久久久| 日本天堂影院在线视频| 欧美日韩在线观看视频| 久久久亚洲av波多野结衣| 久久久水蜜桃av免费网站| 欧美日韩综合久久| www插插插无码免费视频网站| 国产区在线视频| 在线观看亚洲成人| 91视频免费在观看| 久久99久久久欧美国产| 中文字幕第50页| 99re8这里有精品热视频免费| 性欧美办公室18xxxxhd| 青青草av免费在线观看| 欧美在线观看视频在线| 欧美激情精品久久久久久免费| 国产成人精品亚洲午夜麻豆| 国产中文字幕二区| 成人精品中文字幕| 91青青草免费观看| av影院在线免费观看| 亚洲午夜精品久久久久久性色| 国产又大又黄的视频| 亚洲国产裸拍裸体视频在线观看乱了| 日本一区二区三区网站| 久久国内精品自在自线400部| 中文字幕精品在线播放| 露出调教综合另类| 国产精品免费一区二区三区都可以| 黄网址在线观看| 精品国产乱码久久久久久久久 | 久久久蜜桃一区二区人| 在线视频91| 91精品国产乱码久久久竹菊| 日本一本a高清免费不卡| 蜜桃av在线免费观看| 精品国产91久久久久久久妲己 | 日本在线观看不卡视频| 影音先锋成人资源网站| 一区二区三区韩国免费中文网站| 国产在线播放不卡| 欧美久久天堂| 久久久精品久久久久| 色猫av在线| 日韩视频在线你懂得| 欧美人一级淫片a免费播放| 伊人婷婷欧美激情| 婷婷色一区二区三区 | 久久精品视频18| 国产不卡在线播放| av免费一区二区| 久久精品电影| av免费观看国产| 亚洲成av人片乱码色午夜| 日本一区二区三区四区高清视频| 一本一道久久a久久| 国产精品美女免费| av高清不卡| 久久久久久综合网天天| 日本欧美在线视频免费观看| 亚洲精品综合精品自拍| 高清乱码毛片入口| 日韩一区二区三区视频| 亚洲视频一区二区三区四区| 色综合久久66| 日本熟女一区二区| 一区二区欧美国产| 可以免费看av的网址| 国产免费观看久久| 国产网站无遮挡| 成人免费视频国产在线观看| 久久久久久久久久毛片| 精品一区二区三区免费| 国产嫩草在线观看| 久久香蕉精品| 日韩精品视频久久| 亚洲综合丁香| 成年人视频观看| 91久久夜色精品国产九色| 亚洲中文字幕无码一区二区三区 | 里番精品3d一二三区| 国产精品一区二区欧美| 日韩一二三区在线观看| 亚洲www在线观看| 999精品视频在线观看| 国产精品美女呻吟| 成人18视频在线观看| 国产精品精品视频| 91精品国产经典在线观看| 国产成人精彩在线视频九色| 色香欲www7777综合网| 国产精品久久久久7777婷婷| 九七电影院97理论片久久tvb| 国产精品日韩电影| 欧美a一级片| 91在线观看免费高清完整版在线观看| www.久久爱.com| 91嫩草视频在线观看| 超碰97久久| 精品国产一区二区三区免费| 亚洲大片精品免费| 日韩三级电影免费观看| 欧美超碰在线| 黄黄视频在线观看| 国产精品红桃| 日本wwww视频| 蜜桃精品视频在线| 91在线第一页| 成人精品视频一区二区三区 | 日韩精品一卡| 桥本有菜av在线| 欧美日韩四区| 欧美牲交a欧美牲交| 三级在线观看一区二区| 色91精品久久久久久久久| 国产精品主播直播| 麻豆精品国产传媒av| wwwwxxxxx欧美| 91社区视频在线观看| 亚洲情趣在线观看| 国产成人无码精品久在线观看 | 欧美日韩播放| 一区二区日本伦理| 最新亚洲一区| 亚洲老女人av| 成人性视频免费网站| 成熟人妻av无码专区| 一区二区三区四区五区视频在线观看| 日本一本高清视频| 欧美日韩激情在线| 好吊视频一二三区| 最近2019中文字幕第三页视频| 伊人春色在线观看| 日本aⅴ大伊香蕉精品视频| 色999韩欧美国产综合俺来也| 97在线电影| 精品一区二区三| 欧美爱爱视频网站| 一本久久知道综合久久| 成人亚洲免费视频| 99久久婷婷国产| 中文字幕无码日韩专区免费| 欧美性猛交xxxx乱大交极品| 国产免费福利视频| 一区二区三区动漫| 波多野结衣乳巨码无在线观看| 国产精品v片在线观看不卡| 97久久亚洲| 一区二区三区国产福利| 亚洲免费综合| zjzjzjzjzj亚洲女人| 国产精品素人视频| 亚洲另类在线观看| 亚洲电影成人av99爱色| 精品视频在线一区二区| 国产成人一区二区三区| 久久a级毛片毛片免费观看| 国产免费色视频| 日本怡春院一区二区| 日韩aaaaa| 亚洲一区二区三区中文字幕在线| 一区二区三区播放| 国产一区二区日韩精品欧美精品| 美女网站在线看| 国产伦精品一区二区三区视频黑人 | 欧美精品一区二区三区高清aⅴ| 日本精品在线| 国产精品草莓在线免费观看| 亚洲高清极品| 91专区在线观看| 成人av片在线观看| 久久精品国产亚洲av无码娇色 | 欧美日韩天堂| 国产在线视频三区| 成人欧美一区二区三区小说 | 欧美三级 欧美一级| 7777精品久久久大香线蕉| 1区2区3区在线观看| 国产精品成人v| 欧美美女视频| 三级a在线观看| 国产嫩草影院久久久久| 国产精品成人久久久| 中文字幕精品视频| 99久久精品一区二区成人| 欧洲在线视频一区| 久久激情一区| 人妻少妇无码精品视频区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 日韩av在线网页| 97se综合| 亚洲精品国产精品久久| 青青草国产精品亚洲专区无| 在线观看日本黄色| 欧美喷潮久久久xxxxx| 欧美激情视频在线播放| 91在线高清免费观看| 欧美视频在线观看| 污污污www精品国产网站| 婷婷综合五月天| 女人偷人在线视频| 国产精品青青在线观看爽香蕉| 国产精品久久久久无码av| 丰满饥渴老女人hd| 国产精品麻豆一区| 欧美一区二区福利在线| 波多野结衣中文字幕久久| 美日韩精品免费| 美女一区二区三区| 欧美偷拍第一页| 亚洲国产精品高清久久久| 周于希免费高清在线观看 | 日本aaa视频| 欧美乱妇23p| 男人添女人下部高潮视频在线观看 | 精品中文字幕av| 国产精品伦一区二区三级视频| 91麻豆一区二区| 午夜欧美大片免费观看| 国产亚洲一卡2卡3卡4卡新区 | 日本不卡电影| 老女人性生活视频| 欧美午夜片欧美片在线观看| 麻豆视频免费在线观看| 国产精品一区视频| 日韩成人伦理电影在线观看| 九九在线观看视频| 亚洲日韩欧美视频| 美女精品视频在线| 日本www在线播放| 中文字幕亚洲一区二区av在线 | 国产99免费视频| 久久999免费视频| 国产区精品区| 永久看看免费大片| 在线看一区二区| 福利小视频在线| 亚洲精品国产精品国自产| 99免费精品在线观看| 一级特黄aaa| 欧美专区日韩视频| 欧美韩国一区| 国产真人真事毛片视频| 亚洲第一中文字幕在线观看|