代碼隨想錄day23 回溯part2

39.組合總和

給你一個 無重復元素 的整數數組 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 。
僅有這兩種組合。
示例 2:輸入: candidates = [2,3,5], target = 8
輸出: [[2,2,2,2],[2,3,3],[3,5]]
示例 3:輸入: candidates = [2], target = 1
輸出: []

注意candidates中的數字可以無限次重復被讀取
還是和回溯法模板一樣,全局變量path和res。需要一個startIndex控制for循環的起始位置。
什么時候需要startIndex:一個集合求組合(例如昨天的兩道題)
多個集合求組合就不需要startIndex(電話號碼)

每個數字可以重復利用:startIndex每次不用+1。

優化:如果在for循環中剪枝,就需要對數組先進行排序,這樣如果sum+candidates[i]>target,那么后面的i肯定也都不符合條件。

class Solution {List<Integer> path;List<List<Integer>> res;int[] candidates;public List<List<Integer>> combinationSum(int[] candidates, int target) {path = new ArrayList<>();res = new ArrayList<>();this.candidates = candidates;Arrays.sort(this.candidates);backtracking(target, 0, 0);return res;}void backtracking(int target, int sum, int startIndex) {// if (target < sum) {//     return;// }if (target == sum) {res.add(new ArrayList<Integer>(path));return;}for (int i = startIndex; i < candidates.length && sum + candidates[i] <= target; i++) {path.add(candidates[i]);sum += candidates[i];backtracking(target, sum, i);sum -= candidates[i];path.remove(path.size() - 1);}}
}

40.組合總和II

給定一個候選人編號的集合 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]
]
示例 2:輸入: candidates = [2,5,2,1,2], target = 5,
輸出:
[
[1,2,2],
[5]
]

數字可以重復,但是不能超過在candicates中出現的次數。比如candidates有兩個1,那結果集合不能超過2個1。
所以在上一題的基礎上,需要引入一個布爾數組used,標志每個candidates中的數是否被使用了(加入了path)。
Java初始化boolean數組都是false。
回溯函數同樣需要index,但是因為candidates中的值不能重復,所以繼續回溯還是要i+1。

去重:
同一樹枝使用過:同一樹枝上的元素都是一個組合里的元素(path),不用去重
同一樹層使用過:需要去重,去重前還要先對數組排序。同一樹層上相同兩個重復元素不能重復選取。所以判斷條件就是candidates[i-1]==candidates[i]&&used[i-1]==false。used[i-1]是false說明了i-1元素在上一次回溯使用過,所以不能再選。

class Solution {int[] candidates;List<List<Integer>> res;List<Integer> path;public List<List<Integer>> combinationSum2(int[] candidates, int target) {Arrays.sort(candidates); // 樹層去重需要對數組排序this.candidates = candidates;res = new ArrayList<>();path = new ArrayList<>();boolean[] used = new boolean[candidates.length];backtracking(target, 0, 0, used);return res;}void backtracking(int target, int sum, int startIndex, boolean[] used) {if (sum == target) {res.add(new ArrayList<Integer>(path));return;}for (int i = startIndex; i < candidates.length && sum + candidates[i] <= target; i++) {if (i > 0 && candidates[i - 1] == candidates[i] && used[i - 1] == false) {continue;}sum += candidates[i];path.add(candidates[i]);used[i] = true;backtracking(target, sum, i + 1, used);used[i] = false;path.remove(path.size() - 1);sum -= candidates[i];}}
}

131.分割回文串

給你一個字符串 s,請你將 s 分割成一些 子串,使每個子串都是 回文串 。返回 s 所有可能的分割方案。

示例 1:輸入:s = "aab"
輸出:[["a","a","b"],["aa","b"]]
示例 2:輸入:s = "a"
輸出:[["a"]]

切割問題也類似組合問題,可以使用排序解決。需要一個startIndex標志每次分割開始的位置。
backtracking終止條件:startIndex>=s.length() startIndex已經走到了字符串末尾,說明分割完了
for循環從startIndex的位置開始遍歷,每次判斷[startIndex,i]子串(閉區間)是否是回文串,如果是,就分割,然后下次回溯從i+1開始。

class Solution {List<String> path;List<List<String>> res;public List<List<String>> partition(String s) {path = new ArrayList<>();res = new ArrayList<>();backtracking(s, 0);return res;}public void backtracking(String s, int startIndex) {if (startIndex >= s.length()) {res.add(new ArrayList<String>(path));return;}for (int i = startIndex; i < s.length(); i++) {if (isPalindrome(s, startIndex, i)) {String str = s.substring(startIndex, i + 1);path.add(str);} else {continue;}backtracking(s, i + 1);path.remove(path.size() - 1);}}public boolean isPalindrome(String s, int begin, int end) {while (begin < end) {if (s.charAt(begin) != s.charAt(end)) {return false;}begin++;end--;}return true;}
}

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

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

相關文章

回調函數中 qsort 函數的使用

目錄 一.冒泡排序 二.指針類型 void* 三. qsort 1.簡介 2.研究函數參數 3.怎么用&#xff1f; (1)排數組&#xff0c;升序 (2)排序結構體 四.用冒泡排序思想&#xff0c;模擬實現 qsort (可排序任意類型數據) 1.函數參數設計 2.在 if (cmp( )>0) 怎么傳參&#x…

電機控制常見面試問題(十四)

文章目錄 一.電機信噪比二.電機零點偏移校正和極對數自適應1.零點偏移量檢測?2. 極對數識別三.交流電機電流紋波怎么產生的1.電源相關因素2.電機本體特性3.?PWM逆變器諧波4.負載與環境干擾5.診斷流程建議 四.談談對諧波的理解1.諧波定義2.次諧波產生源3.次諧波的檢測與分析4.…

axios和fetch的對比

axios 和 fetch 是用于發起 HTTP 請求的兩種常見工具&#xff0c;它們的主要區別如下&#xff1a; 1. 瀏覽器兼容性 axios&#xff1a;基于 XMLHttpRequest&#xff0c;兼容性較好&#xff0c;支持較舊的瀏覽器&#xff08;如 IE11&#xff09;。fetch&#xff1a;現代瀏覽器…

Java Timer定時任務源碼分析

前言 Java 提供的java.util.Timer類可以用來執行延時任務&#xff0c;任務可以只執行一次&#xff0c;也可以周期性的按照固定的速率或延時來執行。 實現一個延時任務調度器&#xff0c;核心有兩點&#xff1a; 如何存儲延時任務如何調度執行延時任務 源碼分析 TimerTask …

【安全運營】用戶與實體行為分析(UEBA)淺析

目錄 用戶與實體行為分析&#xff08;UEBA&#xff09;簡介一、UEBA的核心概念1. 行為基線建立2. 異常檢測3. 風險評分4. 上下文關聯 二、UEBA的應用場景1. 內部威脅檢測2. 外部威脅應對3. 合規性和審計支持 三、UEBA的技術實現1. 大數據技術2. 機器學習算法3. 可視化工具 四、…

系統思考—啤酒游戲經營決策沙盤模擬

再次感謝文華學院的邀請&#xff0c;為經緯集團管理層帶來 《啤酒游戲經營決策沙盤》&#xff01; 很多朋友問&#xff1a;“最近是不是啤酒游戲上的少了&#xff1f;” 其實&#xff0c;真正的關鍵不是游戲本身&#xff0c;而是——如何讓大家真正看見復雜系統中的隱性結構。 …

排序算法實現:插入排序與希爾排序

目錄 一、引言 二、代碼整體結構 三、宏定義與頭文件 四、插入排序函數&#xff08;Insertsort&#xff09; 函數作用 代碼要點分析 五、希爾排序函數&#xff08;ShellSort&#xff09; 函數作用 代碼要點分析 六、打印數組函數&#xff08;PrintSort&#x…

redis的key是如何找到對應存儲的數據原理

在 Redis 中,Key 是數據的唯一標識符,而 Value 是與 Key 關聯的實際數據。Redis 通過高效的鍵值對存儲機制,能夠快速定位和訪問數據。以下是 Redis 如何通過 Key 找到對應存儲數據的詳細解析: 1. Redis 的數據存儲結構 Redis 是一個基于內存的鍵值存儲系統,其核心數據結構…

github上傳本地文件到遠程倉庫(空倉庫/已有文件的倉庫)

今天搞自己本地訓練的代碼到倉庫留個檔&#xff0c;結果遇到了好多問題&#xff0c;到騰了半天才搞明白整個過程&#xff0c;留在這里記錄一下。 遠程空倉庫 主要根據官方教程&#xff1a;Adding locally hosted code to GitHub - GitHub Docs #1. cd到你需要上傳的文件夾&a…

Redis數據類型詳解

Redis數據類型詳解 Redis 共有 5 種基本數據類型&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#xff08;集合&#xff09;、Hash&#xff08;散列&#xff09;、Zset&#xff08;有序集合&#xff09;。 除了 5 種基本的數據…

【第13章】億級電商平臺訂單系統-高性能之異步架構設計

1-1 本章導學 課程導學 學習目標:掌握大型系統架構設計難點之高性能異步架構設計項目落地:訂單系統高性能異步架構設計(年交易200億B2B電商平臺)本章主要內容 1. 為何需要異步消息架構 分析同步架構的性能瓶頸異步架構對系統解耦與性能提升的核心價值2. 確定異步消息技術…

2025-03-20 學習記錄--C/C++-C 庫函數 - toupper()、tolower()、 isspace()

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、C 庫函數 - toupper() ?? C 標準庫 - <ctype.h> C 標準庫的 ctype.h 頭文件提供了一些函數&#xff0c;可用于測試和…

LoRaWAN技術解析

LoRaWAN&#xff08;Long Range Wide Area Network&#xff09;是一種基于 LoRa&#xff08;Long Range&#xff09;技術的低功耗廣域網絡協議&#xff0c;專為物聯網&#xff08;IoT&#xff09;設備的無線通信而設計。它是一種開放的、標準化的通信協議&#xff0c;支持大規模…

織夢DedeCMS如何獲得在列表和文章頁獲得頂級或上級欄目名稱

獲得頂級或二級欄目的名稱&#xff0c;都需要修改php文件&#xff0c;修改的文件【/include/common.func.php】將代碼插入到這個文件的最下面即可&#xff1b; 一、獲得當前文章或欄目的【頂級欄目】名稱 1、插入頂級欄目代段 //獲取頂級欄目名 function GetTopTypename($id…

虛幻基礎:ue自定義類

文章目錄 Gameplay Tag&#xff1a;ue標簽類創建&#xff1a;其他-數據表格-gameplaytag安裝&#xff1a;項目設置&#xff1a;gamePlayTag&#xff1a;gamePlay標簽列表使用&#xff1a;變量類型&#xff1a;gamePlayTag primary data asset&#xff1a;ue數據類&#xff1a;通…

易語言模擬真人鼠標軌跡算法

一.簡介 鼠標軌跡算法是一種模擬人類鼠標操作的程序&#xff0c;它能夠模擬出自然而真實的鼠標移動路徑。 鼠標軌跡算法的底層實現采用C/C語言&#xff0c;原因在于C/C提供了高性能的執行能力和直接訪問操作系統底層資源的能力。 鼠標軌跡算法具有以下優勢&#xff1a; 模擬…

Matplotlib 柱形圖

Matplotlib 柱形圖 引言 在數據可視化領域&#xff0c;柱形圖是一種非常常見且強大的圖表類型。它能夠幫助我們直觀地比較不同類別或組之間的數據大小。Matplotlib&#xff0c;作為Python中最受歡迎的數據可視化庫之一&#xff0c;提供了豐富的繪圖功能&#xff0c;其中包括創…

sparksql的Transformation與 Action操作

Transformation操作 與RDD類似的操作 map、filter、flatMap、mapPartitions、sample、 randomSplit、 limit、 distinct、dropDuplicates、describe&#xff0c;而以上這些都是企業中比較常用的&#xff0c;這里在一個文件中統一論述 val df1 spark.read.json("src/m…

微軟Data Formulator:用AI重塑數據可視化的未來

在數據驅動的時代,如何快速將復雜數據轉化為直觀的圖表是每個分析師面臨的挑戰。微軟研究院推出的開源工具 Data Formulator,通過結合AI與交互式界面,重新定義了數據可視化的工作流。本文將深入解析這一工具的核心功能、安裝方法及使用技巧,助你輕松駕馭數據之美。 一、Dat…

20分鐘上手DeepSeek開發:SpringBoot + Vue2快速構建AI對話系統

20分鐘上手DeepSeek開發&#xff1a;SpringBoot Vue2快速構建AI對話系統 前言 在生成式AI技術蓬勃發展的今天&#xff0c;大語言模型已成為企業智能化轉型和個人效率提升的核心驅動力。作為國產大模型的優秀代表&#xff0c;DeepSeek憑借其卓越的中文語義理解能力和開發者友…