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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

求n个数中第k大的数_互联网高频面试题目:「回溯算法」求组合总和

發布時間:2025/4/5 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求n个数中第k大的数_互联网高频面试题目:「回溯算法」求组合总和 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我將算法學習相關的資料已經整理到了Github :https://github.com/youngyangyang04/leetcode-master,里面還有leetcode刷題攻略、各個類型經典題目刷題順序、思維導圖看一看一定會有所收獲,如果給你有幫助給一個star支持一下吧!

第216題.組合總和III

鏈接:

https://leetcode-cn.com/problems/combination-sum-iii/

找出所有相加之和為 n 的 k 個數的組合。組合中只允許含有 1 - 9 的正整數,并且每種組合中不存在重復的數字。

說明:

  • 所有數字都是正整數。
  • 解集不能包含重復的組合。

示例 1:
輸入: k = 3, n = 7
輸出: [[1,2,4]]

示例 2:
輸入: k = 3, n = 9
輸出: [[1,2,6], [1,3,5], [2,3,4]]

思路

本題就是在[1,2,3,4,5,6,7,8,9]這個集合中找到和為n的k個數的組合。

相對于回溯算法:求組合問題!,無非就是多了一個限制,本題是要找到和為n的k個數的組合,而整個集合已經是固定的了[1,...,9]。

想到這一點了,做過77. 組合之后,本題是簡單一些了。

本題k相當于了樹的深度,9(因為整個集合就是9個數)就是樹的寬度。

例如 k = 2,n = 4的話,就是在集合[1,2,3,4,5,6,7,8,9]中求 k(個數) = 2, n(和) = 4的組合。

選取過程如圖:

圖中,可以看出,只有最后取到集合(1,3)和為4 符合條件。

回溯三部曲

  • 「確定遞歸函數參數」

和回溯算法:求組合問題!一樣,依然需要一維數組path來存放符合條件的結果,二維數組result來存放結果集。

這里我依然定義path 和 result為全局變量。

至于為什么取名為path?從上面樹形結構中,可以看出,結果其實就是一條根節點到葉子節點的路徑。

vector>?result;?//?存放結果集?vector?path;?//?符合條件的結果

接下來還需要如下參數:

  • targetSum(int)目標和,也就是題目中的n。
  • k(int)就是題目中要求k個數的集合。
  • sum(int)為已經收集的元素的總和,也就是path里元素的總和。
  • startIndex(int)為下一層for循環搜索的起始位置。

所以代碼如下:

vector>?result;vector?path;void?backtracking(int?targetSum,?int?k,?int?sum,?int?startIndex)?

其實這里sum這個參數也可以省略,每次targetSum減去選取的元素數值,然后判斷如果targetSum為0了,說明收集到符合條件的結果了,我這里為了直觀便于理解,還是加一個sum參數。

還要強調一下,回溯法中遞歸函數參數很難一次性確定下來,一般先寫邏輯,需要啥參數了,填什么參數。

  • 確定終止條件

什么時候終止呢?

在上面已經說了,k其實就已經限制樹的深度,因為就取k個元素,樹再往下深了沒有意義。

所以如果path.size() 和 k相等了,就終止。

如果此時path里收集到的元素和(sum) 和targetSum(就是題目描述的n)相同了,就用result收集當前的結果。

所以 終止代碼如下:

if?(path.size()?==?k)?{????if?(sum?==?targetSum)?result.push_back(path);????return;?//?如果path.size()?== k 但sum != targetSum 直接返回}
  • 「單層搜索過程」

本題和回溯算法:求組合問題!區別之一就是集合固定的就是9個數[1,...,9],所以for循環固定i<=9

如圖:

處理過程就是 path收集每次選取的元素,相當于樹型結構里的邊,sum來統計path里元素的總和。

代碼如下:

for?(int?i?=?startIndex;?i?<=?9;?i++)?{????sum?+=?i;????path.push_back(i);????backtracking(targetSum,?k,?sum,?i?+?1);?//?注意i+1調整startIndex????sum?-=?i;?//?回溯?????path.pop_back();?//?回溯?}

「別忘了處理過程 和 回溯過程是一一對應的,處理有加,回溯就要有減!」

參照關于回溯算法,你該了解這些!中的模板,不難寫出如下C++代碼:

class?Solution?{private:????vector>?result;?//?存放結果集?????vector?path;?//?符合條件的結果????// targetSum:目標和,也就是題目中的n。?????// k:題目中要求k個數的集合。?????// sum:已經收集的元素的總和,也就是path里元素的總和。?????// startIndex:下一層for循環搜索的起始位置。????void?backtracking(int?targetSum,?int?k,?int?sum,?int?startIndex)?{????????if?(path.size()?==?k)?{????????????if?(sum?==?targetSum)?result.push_back(path);????????????return;?//?如果path.size()?==?k?但sum?!=?targetSum?直接返回????????}????????for?(int?i?=?startIndex;?i?<=?9;?i++)?{????????????sum?+=?i;?//?處理????????????path.push_back(i);?//?處理????????????backtracking(targetSum,?k,?sum,?i?+?1);?//?注意i+1調整startIndex????????????sum?-=?i;?//?回溯????????????path.pop_back();?//?回溯????????}????}public:????vector>?combinationSum3(int?k,?int?n)?{????????result.clear();?//?可以不加????????path.clear();???//?可以不加????????backtracking(n,?k,?0,?1);????????return?result;????}};

剪枝

這道題目,剪枝操作其實是很容易想到了,想必大家看上面的樹形圖的時候已經想到了。

如圖:

已選元素總和如果已經大于n(圖中數值為4)了,那么往后遍歷就沒有意義了,直接剪掉。

那么剪枝的地方一定是在遞歸終止的地方剪,剪枝代碼如下:

if?(sum?>?targetSum)?{?//?剪枝操作????return;}

最后C++代碼如下:

class?Solution?{private:????vector>?result;?//?存放結果集????vector?path;?//?符合條件的結果????// targetSum:目標和,也就是題目中的n。????// k:題目中要求k個數的集合。????// sum:已經收集的元素的總和,也就是path里元素的總和。????// startIndex:下一層for循環搜索的起始位置。????void?backtracking(int?targetSum,?int?k,?int?sum,?int?startIndex)?{????????if?(sum?>?targetSum)?{?//?剪枝操作????????????return;?//?如果path.size()?==?k?但sum?!=?targetSum?直接返回????????}????????if?(path.size()?==?k)?{????????????if?(sum?==?targetSum)?result.push_back(path);????????????return;????????}????????for?(int?i?=?startIndex;?i?<=?9;?i++)?{????????????sum?+=?i;?//?處理????????????path.push_back(i);?//?處理????????????backtracking(targetSum,?k,?sum,?i?+?1);?//?注意i+1調整startIndex????????????sum?-=?i;?//?回溯????????????path.pop_back();?//?回溯????????}????}public:????vector>?combinationSum3(int?k,?int?n)?{????????result.clear();?//?可以不加????????path.clear();???//?可以不加????????backtracking(n,?k,?0,?1);????????return?result;????}};

總結

開篇就介紹了本題與回溯算法:求組合問題!的區別,相對來說加了元素總和的限制,如果做完回溯算法:求組合問題!再做本題再合適不過。

分析完區別,依然把問題抽象為樹形結構,按照回溯三部曲進行講解,最后給出剪枝的優化。

相信做完本題,大家對組合問題應該有初步了解了。

「就醬,如果感覺對你有幫助,就幫Carl轉發一下吧,讓更多小伙伴知道這里!」

我是程序員Carl,個人主頁:https://github.com/youngyangyang04

這里每天8:35準時推送一道經典算法題目,我選擇的每道題目都不是孤立的,而是由淺入深,環環相扣,幫你梳理算法知識脈絡,輕松學算法!

@代碼隨想錄 期待你的關注

總結

以上是生活随笔為你收集整理的求n个数中第k大的数_互联网高频面试题目:「回溯算法」求组合总和的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 少女忠诚电影高清免费 | 欧美日韩免费网站 | 欧美黄色免费看 | av网址在线播放 | 视频福利在线观看 | 国产精品国产三级国产aⅴ无密码 | 丰满白嫩尤物一区二区 | 视频二区在线观看 | 国产视频在线看 | 国产又粗又猛又爽又黄的视频小说 | 免费国产黄 | 日本色呦呦 | 第一福利在线视频 | 99在线免费观看视频 | 精品国产一区二区三区av性色 | 精品一区二区三区毛片 | 91 高清 在线 制服 偷拍 | 黑人玩弄人妻一区二区绿帽子 | 色视频网站在线观看 | 欧美精品一区二区三区久久久竹菊 | 插插操操| 国产精品无码一区二区三 | 久久久无码18禁高潮喷水 | 四虎新网址 | 伊人涩涩 | 日韩综合精品 | 激情另类小说 | 国产精品久久久久久免费免熟 | 超碰人人在线观看 | 中文字幕第2页 | 国产一级片免费播放 | 一区二区日韩电影 | 免费涩涩 | 一本久道视频一本久道 | 日本中文字幕在线视频 | 欧美日韩亚洲综合 | 性欧美hd调教 | 成人国产三级 | 一起草最新网址 | xx色综合 | 丝袜天堂 | 国产中文字幕乱人伦在线观看 | 欧美寡妇性猛交ⅹxxx | 免费看污黄网站在线观看 | 国产男人搡女人免费视频 | 亚洲人视频在线 | 亚洲视频在线观看网站 | 九一国产精品 | 国产又大又粗又爽 | 永久中文字幕 | 国产日本亚洲 | 久久另类ts人妖一区二区 | 天天摸日日干 | 日韩av不卡在线播放 | 国产精品国产三级国产播12软件 | 日韩人妻精品一区二区三区 | 成人免费视频国产免费 | 奇米影视一区二区 | 色射网 | 中文字幕欧美人妻精品 | 美女毛片视频 | 在线观看www. | 一区二区三区免费在线观看视频 | 黄色在线免费网站 | 国产毛片在线 | 国产麻豆精品一区二区 | 色综合图片区 | 插插插干干干 | 国产精品黄在线观看 | 91操视频 | 丰满少妇高潮久久三区 | 91丨九色丨黑人外教 | 国产丰满大乳奶水在线视频 | 777奇米色| 丁香花电影高清在线阅读免费 | 日韩欧美黄色网址 | 国产精品伦理一区 | 亚洲爱色 | 国产亚洲欧美在线 | 亚洲在线一区 | 日本一区二区不卡视频 | 久久精品人妻一区二区 | 熟妇高潮精品一区二区三区 | 九九精品在线播放 | 在线观看网站av | 一级做a免费视频 | 九九影视理伦片 | 波多野吉衣一区 | 91操人| 在线国产精品一区 | 欧美一区不卡 | 激情在线网站 | 动漫美女被吸乳奶动漫视频 | 中出视频在线观看 | 日本a级一区 | 黄色片免费网站 | www.色香蕉| 在线免费观看亚洲视频 | 99久久久国产精品免费蜜臀 |