經典的回溯算法題leetcode組合問題整理及思路代碼詳解

目錄

組合問題

leetcode77題.組合

leetcode216題.組合總和III

leetcode40題.組合總和II

leetcode39題.組合總和


倘若各位不太清楚回溯算法可以去看我上一篇文章。

回溯算法詳解-CSDN博客

組合問題

一般組合和排列類的問題我們都會轉化成一個樹形問題,更便于理解。

leetcode77題.組合

77. 組合 - 力扣(LeetCode)

題目:給定兩個整數 n 和 k,返回范圍 [1, n] 中所有可能的 k 個數的組合。

你可以按 任何順序 返回答案。

示例 1:

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

class Solution {// 創建存放結果集List<List<Integer>> res = new ArrayList<>();// 存放單個子集List<Integer> temp = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backTrace(n, k , 1);//index從1開始選,之后選2、選3return res;}//一般回溯操作沒有返回值,index表示我們選到了哪里,比如我們選到了1、2、3void backTrace(int n, int k, int index){// 優化:稱之為剪枝,看能否有k個元素可以選//選進去的元素 + 可選元素 < kif(temp.size() + (n - index + 1) < k){return;}// 結束條件:我們已經選了k個元素if(temp.size() == k){res.add(new ArrayList<>(temp));return;}// 從多個元素中逐一選擇,從index到n就是我們的可選子集for(int i = index; i <= n; i++){// 選元素進行處理,比如選了1temp.add(i);// 繼續下一層,即2、3、4backTrace(n, k, i + 1);// 撤銷我們處理過的元素temp.remove(temp.size() - 1);}}
}

leetcode216題.組合總和III

216. 組合總和 III - 力扣(LeetCode)

找出所有相加之和為?n?的?k?個數的組合,且滿足下列條件:

  • 只使用數字1到9
  • 每個數字最多使用一次

返回?所有可能的有效組合的列表?。該列表不能包含相同的組合兩次,組合可以以任何順序返回。

示例 1:

輸入: k = 3, n = 7
輸出: [[1,2,4]]
解釋:
1 + 2 + 4 = 7
沒有其他符合的組合了。
class Solution {//保存最終的結果List<List<Integer>> res = new ArrayList<>();//臨時的保存每一組成立的結果List<Integer> temp = new ArrayList<>();public List<List<Integer>> combinationSum3(int k, int n) {backTrace(n, k, 1, 0);return res;}void backTrace(int n, int k, int index, int sum){// 優化剪枝if(sum > n){return;}//湊不到k個數-> 可選的數 + 已選的數 < kif((9 - index + 1) + temp.size() < k){return;}// 結束條件:已經選了k個數if(temp.size() == k){if(sum == n){res.add(new ArrayList<>(temp));}return;}// 回溯for(int i = index; i <= 9; i++){// 選其中一個元素temp.add(i);sum = sum + i;backTrace(n, k, i + 1, sum);// 撤銷處理temp.remove(temp.size() - 1);sum = sum - i;}}
}

leetcode40題.組合總和II

40. 組合總和 II - 力扣(LeetCode)

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

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

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

示例 1:

輸入: candidates = [10,1,2,7,6,1,5], target = 8,
輸出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
class Solution {//存結果的結果集List<List<Integer>> res = new ArrayList<>();//臨時變量存子集List<Integer> temp = new ArrayList<>();public List<List<Integer>> combinationSum2(int[] candidates, int target) {Arrays.sort(candidates);//給數組排序backTrack(candidates, target, 0, 0);//index表示數組下標,從0開始return res;}/*怎么處理重復的組合1. 排序 [1, 1, 5, 6, 7, 10];*/void backTrack(int[] candidates, int target, int index, int sum){//剪枝if(sum > target){return;}// 結束條件if(sum == target){res.add(new ArrayList<>(temp));return;}// 處理主要邏輯for(int i = index; i < candidates.length; i++){// 遇到重復的數就跳過,去掉重復的組合if(i > index && candidates[i] == candidates[i-1]){continue;}// 從多個元素選擇一個temp.add(candidates[i]);sum = sum + candidates[i];backTrack(candidates, target, i + 1, sum);// 撤銷之前的操作temp.remove(temp.size() - 1);sum = sum - candidates[i];}}
}

leetcode39題.組合總和

39. 組合總和 - 力扣(LeetCode)

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

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

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

示例 1:

輸入:candidates = [2,3,6,7], target = 7
輸出:[[2,2,3],[7]]
解釋:
2 和 3 可以形成一組候選,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一個候選, 7 = 7 。
僅有這兩種組合。?

class Solution {//存取結果List<List<Integer>> res = new ArrayList<>();//臨時存取子集List<Integer> temp = new ArrayList<>();public List<List<Integer>> combinationSum(int[] candidates, int target) {backTrack(candidates, target, 0, 0);return res;}void backTrack(int[] candidates, int target, 0int index, int sum){// 剪枝if(sum > target){return;}// 結束條件if(sum == target){res.add(new ArrayList<>(temp));return;}// 處理主要邏輯for(int i = index; i < candidates.length; i++){// 從多個元素選擇一個temp.add(candidates[i]);sum = sum + candidates[i];//可以重復選擇i,所以不用i+1backTrack(candidates, target, i, sum);// 撤銷之前的操作temp.remove(temp.size() - 1);sum = sum - candidates[i];}}
}

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

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

相關文章

26. 刪除有序數組中的重復項(remove-duplicates-from-sorted-array)

26. 刪除有序數組中的重復項(remove-duplicates-from-sorted-array) 給你一個 非嚴格遞增排列 的數組 nums &#xff0c;請你** 原地** 刪除重復出現的元素&#xff0c;使每個元素 只出現一次 &#xff0c;返回刪除后數組的新長度。元素的 相對順序 應該保持 一致 。然后返回 …

批量創建表空間數據文件(DM8:達夢數據庫)

DM8:達夢數據庫 - - 批量創建表空間數據文件 環境介紹1 批量創建表空間SQL2 達夢數據庫學習使用列表 環境介紹 在某些場景(分區表子表)需要批量創建表空間,給不同的表使用,以下代碼是批量創建表空間的SQL語句; 1 批量創建表空間SQL --創建 24個數據表空間,每個表空間有3個數…

強化學習小筆記 —— 如何選擇合適的更新步長

在強化學習中&#xff0c;動作價值函數的更新可以使用增量法&#xff0c;如下所示&#xff1a; Q k 1 k ∑ i 1 k r i 1 k ( r k ∑ i 1 k ? 1 r i ) 1 k ( r k ( k ? 1 ) Q k ? 1 ) 1 k ( r k k Q k ? 1 ? Q k ? 1 ) Q k ? 1 1 k [ r k ? Q k ? 1 ] \beg…

Linux寶塔面板搭建Discuz論壇, 并內網穿透實現公網訪問

Linux寶塔面板搭建Discuz論壇&#xff0c; 并內網穿透實現公網訪問 文章目錄 Linux寶塔面板搭建Discuz論壇&#xff0c; 并內網穿透實現公網訪問前言1.安裝基礎環境2.一鍵部署Discuz3.安裝cpolar工具4.配置域名訪問Discuz5.固定域名公網地址6.配置Discuz論壇 &#x1f4f7; 江池…

低代碼平臺推薦:五大低代碼廠商誰的模式更“合適”

隨著數字化時代的到來&#xff0c;低代碼開發平臺作為提高數字生產力的工具正受到越來越多企業的關注&#xff0c;市面上的低代碼產品和廠商更是“亂花漸欲迷人眼”。 各家產品不僅功能各有不同&#xff0c;甚至商機都有區別的情況&#xff0c;如何做好產品選型已然成了采購企…

C語言——指針(一)

&#x1f4dd;前言 這篇文章主要帶大家初步認識一下指針&#xff0c;供大家理解參考。 主要歸納與講解&#xff1a; 1&#xff0c;指針與指針變量 2&#xff0c;指針的基本使用&#xff08;如何定義&#xff0c;初始化&#xff0c;引用&#xff09; &#x1f3ac;個人簡介&…

計算方法 期末總結

思維導圖 緒論 算法的性質&#xff1a; 有窮性、確切性、有輸入輸出、可行性 算法的描述方法&#xff1a; 自然語言、偽代碼、流程圖、N-S流程圖 算法設計思想&#xff1a; 化大為小的縮減技術&#xff1a;二分法化難為易的校正技術&#xff1a;開方法化粗為精的松弛技術&a…

無需公網IP,使用內網穿透實現公網訪問本地OpenWRT管理界面

文章目錄 1.openWRT安裝cpolar2.配置遠程訪問地址3.固定公網地址 簡單幾步實現在公網環境下遠程訪問openWRT web 管理界面&#xff0c;使用cpolar內網穿透創建安全隧道映射openWRT web 界面面板443端口&#xff0c;無需公網IP&#xff0c;無需設置路由器。 1.openWRT安裝cpola…

SpringBoot使用ObjectMapper之Long和BigDemical類型的屬性字符串處理,防止前端丟失數值精度

SpringBoot使用ObjectMapper之Long和BigDemical類型的屬性字符串處理&#xff0c;防止前端丟失數值精度! 方式一&#xff1a;注解 使用注解 JsonFormat(shape JsonFormat.Shape.STRING)&#xff0c;如下&#xff1a; import com.fasterxml.jackson.annotation.JsonFormat; …

在arm 64 環境下使用halcon算法

背景&#xff1a; halcon&#xff0c;機器視覺領域神一樣得存在&#xff0c;在windows上&#xff0c;應用得特別多&#xff0c; 但是arm環境下使用得很少。那如何在arm下使用halcon呢。按照官方說明&#xff0c;arm下只提供了運行時環境&#xff0c;并且需要使用價值一萬多人民…

設計高手的秘密武器:5款讓平面作品更出彩的軟件

平面設計是一種迷人而多樣化的藝術形式&#xff0c;它結合了顏色、形狀、排版和創造力&#xff0c;通過圖像和文本傳達信息。市場上有各種各樣的平面設計軟件&#xff0c;選擇合適的設計軟件是成為優秀設計師的重要一步。為了降低軟件成本&#xff0c;大多數設計師會優先使用免…

編譯原理之LL(1)語法分析實驗(附完整C/C++代碼與測試)

一、實驗內容與要求 先從鍵盤讀入要分析的文法&#xff0c;由程序自動構造FIRST、FOLLOW 集以及SELECT集合&#xff0c;判斷是否為LL (1)文法。 分析文法為G[E]&#xff1a; &#xff08;0&#xff09;E→ TE’ &#xff08;1&#xff09;E’→ TE’ &#xff08;2&#xff…

軟件開發王者搭配:80%低代碼+20%高代碼

數字化領域從來不缺新概念&#xff0c;前兩年市場大談云原生、技術中臺、業務中臺等概念&#xff0c;企業更多聚焦在業務與IT架構的升級。而這兩年&#xff0c;隨著低代碼、生成式AI的盛行&#xff0c;大家則開始挖掘數字化應用的低成本建設模式。 在過去&#xff0c;開發一套系…

Linux 是否被過譽了?

Linux 是否被過譽了&#xff1f; 有些人眼里&#xff0c;電腦這種東西就應該是華麗麗的桌面&#xff0c;手握鼠標戳戳按鈕&#xff0c;鍵盤只為偶爾打打字&#xff0c;仿佛windows式的桌面形式才是理所應當&#xff0c;GUI才是理所應當&#xff0c;x86才是理所應當&#xff0c…

使用 NVProf 檢測 CUDA kernel 的 bank conflict

使用 NVProf 檢測 CUDA kernel 的 bank conflict NVProf 指令 使用 NVProf 可以對 bank conflict 進行檢測: nvprof --events shared_ld_bank_conflict,shared_st_bank_conflict <app> [args...]其中: --events 選項指定的 shared_ld_bank_conflict,shared_st_bank_c…

python -opencv 中值濾波 ,均值濾波,高斯濾波實戰

python -opencv 中值濾波 &#xff0c;均值濾波&#xff0c;高斯濾波實戰 cv2.blur-均值濾波 cv2.medianBlur-中值濾波 cv2.GaussianBlur-高斯濾波 直接看代碼吧&#xff0c;代碼很簡單&#xff1a; import copy import math import matplotlib.pyplot as plt import matp…

c++的更嚴格的類型轉換要求

C有更嚴格的類型轉換要求 C中對類型轉換有嚴格的要求&#xff0c;需要的類型和給的類型不 一致時可能會編譯報錯 例如&#xff1a; C語言中 #include<stdio.h> #include<stdlib.h> //全局變量 //C語言中的函數的形參的類型可以不寫&#xff0c;沒有返回值可以返回&…

聯發科正在改寫全球高端手機芯片市場格局

全球高端手機芯片市場正在重塑。 11 月 21 日&#xff0c;聯發科發布了新一代卓越 5G 生成式 AI 移動芯片天璣 8300。 這款定位于中端機檔位的芯片&#xff0c;無論在技術架構還是在實際性能表現上&#xff0c;都實現了對前代旗艦芯片的趕超&#xff0c;徹底打破了業內長期存…

相機和濾鏡應用程序Nevercenter CameraBag Photo mac軟件特點說明

Nevercenter CameraBag Photo mac是一款相機和濾鏡應用程序&#xff0c;它提供了一系列先進的濾鏡、調整工具和預設&#xff0c;可以幫助用戶快速地優化和編輯照片。 Nevercenter CameraBag Photo mac軟件特點 1. 濾鏡&#xff1a;Nevercenter CameraBag Photo提供了超過200種…

復費率電表和預付費電表有哪些區別?

隨著科技的發展和能源管理的日益嚴格&#xff0c;電表技術也在不斷更新換代。復費率電表和預付費電表作為兩種主流的智能電表&#xff0c;各自具有獨特的優勢和應用場景。接下來&#xff0c;小編來為大家詳細解析這兩種電表的區別及其應用場景。 一、復費率電表 1.定義及工作原…