代碼隨想錄訓練營Day 29|力扣39. 組合總和、40.組合總和II、131.分割回文串

1.組合總和

題目鏈接/文章講解: 代碼隨想錄

視頻講解:帶你學透回溯算法-組合總和(對應「leetcode」力扣題目:39.組合總和)| 回溯法精講!_嗶哩嗶哩_bilibili

代碼:(未剪枝版 )

class Solution {
private:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& candidates,int target,int startIndex){// 遞歸出口if(target < 0){return;}if(target == 0){result.push_back(path);return;}// 處理結點for(int i = startIndex;i < candidates.size();i++){target -= candidates[i];path.push_back(candidates[i]);backtracking(candidates,target,i);path.pop_back();target += candidates[i];}}
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {if(candidates.size() == 0) return result;backtracking(candidates,target,0);return result;}
};

?代碼:(剪枝版)

class Solution {
private:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& candidates,int target,int startIndex){// 遞歸出口if(target < 0){return;}if(target == 0){result.push_back(path);return;}// 處理結點// 這里加了判斷:如果下一輪的target已經小于0了,就沒有必要遞歸了for(int i = startIndex;i < candidates.size() && target - candidates[i] >= 0;i++){target -= candidates[i];path.push_back(candidates[i]);backtracking(candidates,target,i);path.pop_back();target += candidates[i];}}
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {if(candidates.size() == 0) return result;sort(candidates.begin(), candidates.end()); // 涉及大小的剪枝必排序backtracking(candidates,target,0);return result;}
};

思路:學到了這種元素數量不限制的取的解法

其實startIndex變量還是要有,因為我們求的是組合,要數層去重;并且這是在同一個數組里取數。

而數量不限,體現在我在遞歸里傳入的starIndex的值是i,而不是i+1了。之前說過for循環管控每一層數的寬度;遞歸則管控數的深度。這樣更改后,就可以在取完一個數的情況后,繼續取這個數。實現如下圖所示的效果:

關于剪枝的操作。這種涉及到總和大小的取值時。剪枝就要將給定的數組排序! 而且要注意給定的數組元素里全是正數,只有正數才越加越大。

這道題,我直接用目標總和target取減去每一個結點的數值了,看最后是否被減為0了。

2.組合總和2?

?題目鏈接/文章講解:代碼隨想錄

視頻講解:回溯算法中的去重,樹層去重樹枝去重,你弄清楚了沒?| LeetCode:40.組合總和II_嗶哩嗶哩_bilibili

?代碼:去重且剪枝過的

class Solution {
private:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& candidates,int target,int startIndex,vector<bool>& used){if(target < 0){return;}if(target == 0){result.push_back(path);return;}for(int i = startIndex;i < candidates.size() && target - candidates[i] >= 0;i++){// used[i - 1] == true,說明同一樹枝candidates[i - 1]使用過// used[i - 1] == false,說明同一樹層candidates[i - 1]使用過// 要對同一樹層使用過的元素進行跳過if(i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false){continue;} // 數層去重used[i] = true;target -= candidates[i];path.push_back(candidates[i]);backtracking(candidates,target,i + 1,used);path.pop_back();target += candidates[i];used[i] = false;}}
public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<bool> used(candidates.size(),false);sort(candidates.begin(),candidates.end());backtracking(candidates,target,0,used);return result;}
};

思路:

這道題和上題的區別是:

每個元素只能使用一次——startIndex為i+1;

給定的元素有重復值,但是要去重后的結果:這里就是難點。首先去重是有兩個維度的。

?一個組合里可以有相同大小的不同元素,所以遞歸操作里不需要去重,即上圖的同一個子樹的數枝上不需要去重;不同組合不能相同,所以要在數層去重。

這里用一個數組used來記錄,遇到的和前一個元素相同的情況(這里去重先去把給定數組排序)時,到底是和前一個相同元素是在同一個樹枝里的,還是同一個樹層里的。

在同一個樹枝里:前一個元素已經加入到了path里,已經使用過了。

在同一個樹層里:前一個元素沒有加入到path里,沒有被使用,這是獨立的兩個分支。

所以如果遇到這種樹層里重復的情況,加個判斷語句,直接continue(因為接下來的情況還有我們要收集的,所以只是跳過這一種情況,用continue)

3.分割回文串

代碼隨想錄

視頻講解:帶你學透回溯算法-分割回文串(對應力扣題目:131.分割回文串)| 回溯法精講!_嗶哩嗶哩_bilibili

?代碼:

class Solution {
private:vector<string> path;vector<vector<string>> result;bool isPalindrome(string& s,int start,int end){while(start <= end){if(s[start] != s[end]){return false;}start++;end--;}return true;}void backtracking(string& s,int startIndex){// 遞歸出口if(startIndex >= s.size()){result.push_back(path);return;}// 遍歷結點// 回文子串的范圍是[startIndex,i]for(int i = startIndex;i < s.size();i++){// 在這里直接判斷是否子串滿足回文子串if(isPalindrome(s,startIndex,i)){string str = s.substr(startIndex,i - startIndex + 1);path.push_back(str);}else{continue;}backtracking(s,i + 1);path.pop_back();}}
public:vector<vector<string>> partition(string s) {if(s.size() == 0) return result;backtracking(s,0);return result;}
};

思路:

關于substr函數:

這道題很巧妙地將startIndex作為了子串的開始下標,子串的范圍可以表示為[startIndex,i]。

同時,本題將判斷條件放在了for循環的里面來判斷,來決定是否要執行下面的遞歸回溯操作。判斷用了一個額外的函數來判斷回文子串。?

細節問題其實就這些。

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

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

相關文章

ChatGPT未來可能應用于iPhone?

蘋果接即將與OpenAI達成協議 ChatGPT未來應用于iPhone 前言 就在5月11日&#xff0c;蘋果公司正與OpenAI進行深入討論&#xff0c;計劃在其最新的iOS操作系統中整合OpenAI的先進技術。這一舉措是蘋果公司在為其產品線融入更先進的人工智能功能所做努力的一部分。 目前情況雙方…

vue2 八大組件通信,父子通信,跨層級通信,事件總線,vuex等

文章目錄 什么是組件通信&#xff1f;父子通信流程propsProps 定義Props 作用特點數組寫法對象寫法&#xff08;props校驗&#xff09;簡寫只驗證數據類型&#xff1a;完整寫法&#xff0c;完整的驗證&#xff1a; props父向子傳值用props父傳子在子組件中修改props $emit子向父…

自定義 Gradle 插件進行統一的靜態代碼分析

靜態代碼分析是一項了不起的技術, 它能讓代碼庫更易于維護. 但是, 如果你在不同的版本庫中擁有多個服務(可能由不同的團隊開發), 如何才能讓每個人都遵循既定的代碼風格呢? 一個好辦法是將所有規則封裝在一個插件中, 該插件會在每個項目構建時自動執行所需的驗證. 因此, 在本…

最新版rancher環境配置安裝和集群搭建詳細教程記錄

&#x1f680; 作者 &#xff1a;“二當家-小D” &#x1f680; 博主簡介&#xff1a;?前荔枝FM架構師、阿里資深工程師||曾任職于阿里巴巴擔任多個項目負責人&#xff0c;8年開發架構經驗&#xff0c;精通java,擅長分布式高并發架構,自動化壓力測試&#xff0c;微服務容器化k…

2024-05-15 問AI: 介紹一下 , Tacotron系列

文心一言 Tacotron系列是由谷歌開發的&#xff0c;主要用于文本到語音&#xff08;TTS&#xff09;轉換的模型。該系列模型基于端到端的序列到序列&#xff08;Seq2Seq&#xff09;架構&#xff0c;能夠直接從文本中生成聽起來自然的語音。 Tacotron模型是首個端到端的TTS深度…

BGP學習三:BGP路由優選12條規則,閃亮登場啦啦啦啦啦

目錄 一.BGP策略工具 &#xff08;1&#xff09;Router-policy作用 &#xff08;2&#xff09;組成部分 &#xff08;3&#xff09;router-policy注意事項 二.優選規則 ①丟棄下一跳不可達 (1)優選prefered-value值大的路由 1.首選優先級 (2)優選local-preference(本地…

Fast-Poisson-Image-Editing代碼介紹(二)

目錄 2.fpei文件下 2.6 number_solver.py 2.7 process.py 2.8 taichi_solver.py 3. 算法總結 4. 代碼運行 4.1 測試 4.2 基于GUI后端自定義框輸出編輯圖像結果 4.2.1 下載open-cv 4.2.2 輸入命令 4.2.3 自定義框 4.2.4 按ESC退出 接續Fast-Poisson-Image-Editing代碼…

企業研發必備網絡:這些關鍵特性,你get了嗎?

對于以研發為核心的企業&#xff0c;如軟件開發、生物制藥、智能汽車等&#xff0c;安全、穩定的研發網絡可是他們業務發展不可或缺的。那么&#xff0c;這些研發網絡究竟有哪些獨特之處&#xff0c;又能為企業帶來哪些價值呢&#xff1f; 首先&#xff0c;我們知道企業研發常常…

開放式耳機哪款具有高性價比?5款高分開放式耳機傾力推薦

作為多年的耳機發燒友&#xff0c;強烈給你們安利開放式耳機&#xff0c;真的是舒適耐用&#xff0c;性價比高。開放式耳機以其獨特的不入耳設計&#xff0c;給用戶帶來了最舒適的佩戴感受。如果小白還不知道怎么選擇高性價比的開放式耳機那就看看我的總結吧&#xff01;下面就…

前端面試題(二十三)(答案版)

面試形式&#xff1a;線上電話面試&#xff1a;一面&#xff1a;時長30分鐘 面試評價&#xff1a;精準考察項目所需技術理論工作實踐 面試官的提問大綱&#xff1a;本公司項目要求本人簡歷 工作經驗&#xff1a;2-4年 公司名稱&#xff1a;深圳XX&#xff08;想知道的就滴喔…

馮喜運:5.15黃金原油晚盤分析:鮑威爾再放鷹,降息懸念重重

【黃金消息面分析】&#xff1a;在全球經濟動蕩和通脹預期不斷上升的背景下&#xff0c;黃金作為傳統的避險資產&#xff0c;再次成為投資者關注的焦點。當前&#xff0c;黃金價格交投于2370美元/盎司左右&#xff0c;連續兩日日線呈現上漲趨勢&#xff0c;而白銀價格也在連續三…

超級數據查看器 教程合集 整理版本 pdf格式 1-31集

點擊下載 超級數據查看器 教程合集整理版本 pdf格式https://download.csdn.net/download/qq63889657/89311725?spm1001.2014.3001.5501

16個可幫助我們工作的職場神器

在職場中&#xff0c;有效的工具可以顯著提高工作效率和組織能力。以下是一些可以幫助我們更好地組織工作的“職場神器”&#xff1a; 項目管理軟件 - zz-plan https://zz-plan.com/ 利用在線甘特圖和看板功能&#xff0c;幫助團隊成員清晰地規劃和跟蹤項目進度。支持資源視圖&…

微信小程序更新日志

還不會用github&#xff0c;git等&#xff0c;先用熟悉的記了 20240514 1.添加了簡易的錄音功能 2.添加了簡易的鬧鐘到時振動功能。 3.準備使用setInterval實現持續振動&#xff0c;直到用戶停止。 4.實現3的功能 5.獲取了訂閱消息模版

如何解決Java 中的精度問題

在 Java 編程中&#xff0c;處理浮點數和超大整數時常常會遇到精度丟失和數值溢出的困擾。為了確保計算結果的精確性&#xff0c;尤其是在金融計算等對精度要求極高的場景中&#xff0c;我們需要使用 BigDecimal 和 BigInteger 類。本文將詳細介紹浮點數精度丟失的原因、如何解…

更新Windows 11 后遇到的一些問題(更新中...)

目錄 插入U盤后讀取不到 在磁盤中新建文件夾需要管理員權限 導致不能安裝一些軟件 插入U盤后讀取不到 解決方法&#xff1a;點擊我的電腦或者是此電腦、選擇管理、找到設備管理器、選擇通用串行總線控制器、右鍵、選擇啟動。 第一步&#xff1a;點擊我的電腦或者是此電腦、選…

數據質量檢測標準

背景 為支持數據倉庫全局的數據質量管控&#xff0c;需做好風險點監控&#xff0c;確保數據的完整性、準確性、及時性、一致性。為此&#xff0c;擬定DQC配置方案&規則&#xff0c;評審通過后落地實施。 目標 核心任務dqc覆蓋率100%&#xff0c;質量問題及時知曉非核心任…

Java學習48-Java 流(Stream)、文件(File)和IO - 復習章節

1.File類的使用 File類的一個實例對應著磁盤上的文件或文件目錄。(必須熟悉)File的實例化(新建一個對象)&#xff0c;常用的方法File類中只有新建&#xff0c;刪除&#xff0c;獲取路徑等方法&#xff0c;不包含讀寫文件的方法&#xff0c;此時需要使用使用下面說的IO流 IO流…

論文閱讀:基于改進 YOLOv5算法的密集動態目標檢測方法

目錄 概要 Motivation 整體架構流程 技術細節 小結 論文地址&#xff1a;基于改進YOLOv5算法的密集動態目標檢測方法 - 中國知網 (cnki.net) 概要 目的&#xff1a;提出一種基于 YOLOv5改進的檢測算法&#xff0c;解決密集動態目標檢測精度低及易漏檢的問題。 方法&…

Linux虛擬主機cPanel重置密碼

我使用的Hostease的Linux虛擬主機產品默認帶普通用戶權限的cPanel面板&#xff0c;這邊自購買后一直未重新設置過cPanel面板的密碼&#xff0c;但是了解到要定期重置一下cPanel面板的密碼&#xff0c;以確保主機數據安全&#xff0c;因此想要進行重置cPanel面板的密碼&#xff…