【回溯算法題記錄】組合總和題匯總

組合總和

  • 39. 組合總和
    • 題目描述
    • 初始思路
    • 后續分析
  • 40. 組合總和 II
    • 題目描述
    • 思路(參考代碼隨想錄)

39. 組合總和

題目🔗

題目描述

給你一個 無重復元素 的整數數組 candidates 和一個目標整數 target ,找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 ,并以列表形式返回。你可以按 任意順序 返回這些組合。

candidates 中的 同一個 數字可以 無限制重復被選取 。如果至少一個數字的被選數量不同,則兩種組合是不同的。

對于給定的輸入,保證和為 target 的不同組合數少于 150 個。

初始思路

好久沒有做回溯的題了,首先畫圖分析一下:
在這里插入圖片描述
因為這題可以重復選取,那么我們每次選取都是在一個相同的集合中(例如candidates={2, 3, 6, 7})。所以除了第一次選擇的元素之外,我們之后所做的操作都是相同的,那么就可以定義一個cur_idx來表示我們首次選擇的元素的index,用一個一維數組vec來記錄當前路徑,當vec中的和等于target時,就把這條路徑放入最終結果集result中。于是我開始寫的代碼就是這樣的:

class Solution {
public:void backtracking(int cur_idx, int target, vector<int>& candidates, vector<int>& vec, vector<vector<int>>& results){// 終止條件if(accumulate(vec.begin(), vec.end(), 0)==target){if(find(results.begin(), results.end(), vec)==results.end()) results.push_back(vec);return;}for(int i = 0; i < candidates.size(); i++){if(accumulate(vec.begin(), vec.end(), 0)+candidates[i]<=target)vec.push_back(candidates[i]);backtracking(i+1, target, candidates, vec, results);vec.pop_back();}  }vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vector<int> vec;vector<vector<int>> results;backtracking(0, target, candidates, vec, results);return results;}
};

但是不出意料的沒通過。。

后續分析

還是認真地走一下三部曲吧QAQ

  1. 遞歸函數參數
    和我上面分析的一樣:
vector<int>& vec;
vector<vector<int>>& results;
void backtracking(int cur_idx, int sum, int target, vector<int>& candidates);

vecresults放在類成員變量中,就不用寫在函數入口。sum是當前路徑統計的和。

  1. 遞歸終止條件
    在這里插入圖片描述
    從上圖來看,當前路徑vec的總和sum大于等于target時,就要返回,并且當sum==target時,我們就要收集結果。
if(sum > target) return;
if(sum == target) {result.push_back(vec);return;
}

啊,可以看出我剛開始忽略了sum>target的情況。

  1. 單層搜索邏輯
    這層的重點在于重復選取的實現,先看代碼:
for (int i = cur_idx; i < candidates.size(); i++) {sum += candidates[i];path.push_back(candidates[i]);backtracking(candidates, target, sum, i); // 關鍵點:不用i+1了,表示可以重復讀取當前的數sum -= candidates[i];   // 回溯path.pop_back();        // 回溯
}

在這里插入圖片描述
整體的邏輯就是我上面這張圖這樣(第二行的{2, 3} sum=5后面應該還有哈,但是我懶得畫了)。

所以整體代碼是:

class Solution {
public:vector<int> vec;vector<vector<int>> results;void backtracking(int cur_idx, int sum, int target, vector<int>& candidates){// 終止條件if(sum == target){results.push_back(vec);return;}if(sum > target) return;// 單層邏輯for(int i = cur_idx; i < candidates.size(); i++){vec.push_back(candidates[i]);sum += candidates[i];backtracking(i, sum, target, candidates);sum -= candidates[i];vec.pop_back();}  }vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vec.clear();results.clear();backtracking(0, 0, target, candidates);return results;}
};

40. 組合總和 II

題目🔗

題目描述

給定一個候選人編號的集合 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的每個數字在每個組合中只能使用 一次

注意:解集不能包含重復的組合。

思路(參考代碼隨想錄)

這題的難點在于集合中有重復元素,但是結果中不能包含重復的組合

這里我們要明白重復有兩種情況:樹枝重復和樹層重復。
在這里插入圖片描述
借用卡哥的圖來說明一下。樹枝重復是左邊的情況,樹層重復是中間的情況。而這題不能出現的是樹層重復。這里我們用一個used數組來表示每一個數是否被使用。

從上面這個圖可以看出,當我們在樹的第二層(集合已經被排序過了,相同元素挨在一起),當我們取第二個1的時候,也就是candicates[1],而前面的candidates[0]也是1,說明已經重復讀取了,所以我們判斷在同一樹層是否重復讀取的邏輯是i > 0 && candidates[i] == candidates[i-1] && used[i-1] == 0

整體代碼如下

class Solution {
public:vector<int> path;vector<vector<int>> results;void backtracking(int index, int target, vector<int>& candidates, int sum, vector<int>& used) {if(sum == target) {results.push_back(path);return;}if(sum > target) {return;}for(int i = index; i < candidates.size(); i++) {if(i > 0 && candidates[i] == candidates[i-1] && used[i-1] == 0)continue;sum += candidates[i];path.push_back(candidates[i]);used[i] = 1;backtracking(i+1, target, candidates, sum, used);sum -= candidates[i];path.pop_back();used[i] = 0;}}vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<int> used(candidates.size(), 0);sort(candidates.begin(), candidates.end());path.clear();results.clear();int sum = 0;backtracking(0, target, candidates, sum, used);return results;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35702.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35702.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35702.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3d渲染軟件有哪些(2),渲染100邀請碼1a12

3D渲染軟件有很多&#xff0c;上次我們介紹了幾個&#xff0c;這次我們接著介紹。 1、Arnold Arnold渲染器是一款基于物理算法的電影級渲染引擎&#xff0c;它具有渲染質量高、材質系統豐富、渲染速度快等特點&#xff0c;是3D設計師的極佳選擇。2、Octane Render Octane Ren…

[Gstreamer] gstbasesink 里的 jitter

gstbasesink 里有一個值是 jitter &#xff0c;直譯為抖動。這個值表示當前到達 gstbasesink chain 函數(push mode) 的 GstBuffer 的系統事件 與 這個 buffer 被期望到達的系統時間的差值。 如果 jitter 是整數&#xff0c;則表示 GstBuffer 到晚了&#xff0c;當前 GstBuffer…

HJI與HJB

問題描述 設連續系統狀態方程和性能指標 X ˙ f ( t , X , U ) X ( t 0 ) X 0 J ? [ X ( t f ) , t f ] ∫ t 0 t f F ( X , U , t ) d t \begin{aligned} \dot{X} & f(t, X, U) \quad X\left(t_{0}\right)X_{0} \\ J & \phi\left[X\left(t_{f}\right), t_{f}\r…

【全網最完整】Open CASCADE Technology (OCCT) 構建項目,QT可視化操作,添加自定義測試內容

前言 本文為了記錄自己在實習的過程中&#xff0c;學習到的有關OCCT開源項目的搭建工作&#xff0c;旨在教會小白從0開始下載開源項目及環境搭配&#xff0c;以及如何添加自定義測試內容&#xff0c;最終結果展示如下&#xff1a; 1、項目下載 本項目共需要使用四個工具&#…

如何快速解決驗證碼圖像問題 | 最佳圖像(OCR)驗證碼解決工具

你是否曾經遇到過陷入一個看似無盡的 CAPTCHA 挑戰中&#xff0c;努力識別扭曲的字符或數字&#xff1f;這些令人抓狂的 CAPTCHA 是為了確保你是人類而不是機器人&#xff0c;但它們也給真正的用戶帶來了頭痛。那么&#xff0c;有沒有快速解決這些 CAPTCHA 圖像的方法&#xff…

2021年12月電子學會青少年軟件編程 中小學生Python編程等級考試三級真題解析(判斷題)

2021年12月Python編程等級考試三級真題解析 判斷題&#xff08;共10題&#xff0c;每題2分&#xff0c;共20分&#xff09; 26、在Python中&#xff0c;0x100010表示十六進制數100010 答案&#xff1a;對 考點分析&#xff1a;考查進制轉換&#xff0c;十六進制數1??0x開頭…

Flask之數據庫

前言&#xff1a;本博客僅作記錄學習使用&#xff0c;部分圖片出自網絡&#xff0c;如有侵犯您的權益&#xff0c;請聯系刪除 目錄 一、數據庫的分類 1.1、SQL 1.2、NoSQL 1.3、如何選擇&#xff1f; 二、ORM魔法 三、使用Flask-SQLALchemy管理數據庫 3.1、連接數據庫服…

移動互聯網應用程序(APP)信息安全等級保護測評標準解讀

隨著移動互聯網的迅猛發展&#xff0c;移動應用(App)已成為個人信息處理與交互的主要渠道&#xff0c;其安全性直接關系到國家安全、社會穩定以及用戶個人隱私權益。為加強移動App的信息安全管理&#xff0c;國家標準化管理委員會正式發布了GB/T 42582-2023《信息安全技術 移動…

等保2.0時,最常見的挑戰是什么?

等保2.0的常見挑戰 等保2.0&#xff08;網絡安全等級保護2.0&#xff09;是中國網絡安全領域的基本制度&#xff0c;它對信息系統進行分級分類、安全保護和安全測評&#xff0c;以提高信息系統的安全性和可信性。在等保2.0的實施過程中&#xff0c;企業和組織面臨多方面的挑戰&…

寵物領養救助管理系帶萬字文檔java項目基于springboot+vue的寵物管理系統java課程設計java畢業設計

文章目錄 寵物領養救助管理系統一、項目演示二、項目介紹三、萬字項目文檔四、部分功能截圖五、部分代碼展示六、底部獲取項目源碼帶萬字文檔&#xff08;9.9&#xffe5;帶走&#xff09; 寵物領養救助管理系統 一、項目演示 寵物領養救助系統 二、項目介紹 基于springbootv…

一站式BI解決方案:從數據采集到處理分析,全面滿足決策支持需求

在數字化浪潮席卷全球的今天&#xff0c;數據已成為企業決策的核心驅動力。然而&#xff0c;面對海量的數據和復雜的分析需求&#xff0c;企業如何高效地收集、整理、分析和利用這些數據&#xff0c;以支持戰略決策和業務優化&#xff0c;成為了一個亟待解決的問題。為了解決這…

AI大模型日報#0626:首款大模型芯片挑戰英偉達、面壁智能李大海專訪、大模型測試題爆火LeCun點贊

導讀&#xff1a;AI大模型日報&#xff0c;爬蟲LLM自動生成&#xff0c;一文覽盡每日AI大模型要點資訊&#xff01;目前采用“文心一言”&#xff08;ERNIE-4.0-8K-latest&#xff09;生成了今日要點以及每條資訊的摘要。歡迎閱讀&#xff01;《AI大模型日報》今日要點&#xf…

加班的員工,循環的電池

寧德時代回應"896" 6月17日&#xff0c;寧德時代因內部宣告「實行 895 工作制&#xff0c;大干 100 天&#xff0c;外籍人員不強制」沖上熱搜&#xff0c;雖后來辟謠 只是發出號召&#xff0c;并無強制員工實行"895"工作制&#xff0c;但輿論并無消退。 昨…

上古世紀臺服怎么注冊賬號 上古世紀臺服怎么下載游戲教程

6月27日&#xff0c;上古世紀戰爭臺服新服公測&#xff0c;一款由虛幻4引擎打造的mmorpg游戲&#xff0c;畫面還是非常精美的&#xff0c;并且游戲玩起來也比較輕松&#xff0c;自動戰斗&#xff0c;自動尋路這些功能都有。游戲的新玩法主要是海戰&#xff0c;駕駛艦船在海上作…

Redis數據結構:深入解析跳躍表(Skiplist)

感謝您閱讀本文&#xff0c;歡迎“一鍵三連”。作者定會不負眾望&#xff0c;按時按量創作出更優質的內容。 ?? 1. 畢業設計專欄&#xff0c;畢業季咱們不慌&#xff0c;上千款畢業設計等你來選。 引言 Redis是一款廣泛使用的內存數據結構存儲系統&#xff0c;支持多種數據結…

Java醫院績效考核系統源碼 :3分鐘帶你了解(醫院績效考核系統有哪些應用場景)三級公立醫院績效考核系統源碼

Java醫院績效考核系統源碼 &#xff1a;3分鐘帶你了解&#xff08;醫院績效考核系統有哪些應用場景&#xff09;三級公立醫院績效考核系統源碼 作為醫院用綜合績效核算系統&#xff0c;系統需要和his系統進行對接&#xff0c;按照設定周期&#xff0c;從his系統獲取醫院科室和…

可持續性是 Elastic: 進步與新機遇的一年

作者&#xff1a;來自 Elastic Keith Littlejohns 我們最新的可持續發展報告&#xff08;Sustainability Report&#xff09;總結了 Elastic 又一個令人興奮的進步年&#xff0c;我們的項目繼續揭示新的機遇。過去的一年對于我們與主要利益相關者群體合作以更好地了解他們的目標…

[解決方案]使用微軟拼音打中文卡頓到離譜

去這里看&#xff0c;發現有65535個文件&#xff0c;基本都是臨時文件。刪除后測試了一下&#xff0c;不會卡頓了但是只要打中文還是會瘋狂生成tmp臨時文件。 問題&#xff1a;輸入法不兼容 解決方案 先把上面那個文件夾里的tmp文件全刪了 直接點是&#xff0c;其他的文件會…

【ajax實戰02】數據管理網站—驗證碼登錄

一&#xff1a;數據提交&#xff08;提交手機驗證碼&#xff09; 核心思路整理 利用form-serialize插件&#xff0c;收集對象形式的表單數據后&#xff0c;一并提交給服務器。后得到返回值&#xff0c;進一步操作 基地址&#xff1a; axios.defaults.baseURL http://geek.…

制作一個智能體:抖音熱點話題文案制作助手

文章目錄 第一步&#xff0c;添加助手第二步&#xff0c;選擇語聚GPT第三步&#xff0c;填寫相關信息第四步&#xff0c;工具中選擇抖音(普通號)第五步&#xff0c;選擇“查詢熱門視頻數據”第六步&#xff0c;測試總結 這篇文章&#xff0c;我們手把手的演示開發一個智能體&am…