算法訓練營Day23

#Java #回溯 #組合問題

開源學習資料

Feeling and experiences:

組合總和III:力扣題目鏈接

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

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

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

該題與之前做的組合很類似,相當于就在組合的基礎上,多了一個三數之和 == 目標值。

回溯思路相同,只需要改一些細節即可:

class Solution {//創建存放結果的集合List<List<Integer>> ans = new ArrayList<>();//創建 path 集合 ,記錄每一次組合結果List<Integer> path = new LinkedList<>();public List<List<Integer>> combinationSum3(int k, int n) {
getCombinationSum(k,n,0,1);
return ans;}public void getCombinationSum(int k , int target,int sum ,int startIndex){//回溯三部曲,確定遞歸函數參數 k , n ,startIndex//這里 n 就相當于目標值 targetif(path.size() == k){if(sum == target){//如果和等于目標值了,則把這一組數據加入到結果集中ans.add(new ArrayList(path));return;}}for(int i = startIndex;i<=9;i++){sum+=i;path.addLast(i);getCombinationSum(k,target,sum,i+1);//回溯:sum-=i;path.removeLast();}}
}

這里的細節與關鍵有:

for循環的 i 不是從1開始了,而是 i = startIndex;

多了一個sum需要進行回溯;

題目要求(從1~9中進行選擇,同樣不能選擇兩個相同的數);

結合之前的組合問題,深刻體會一下回溯算法:

1. 遞歸的終止條件:
? 當?path?的大小等于?k?時,檢查?sum?是否等于?target。如果是,將當前路徑添加到結果集?ans。
? 這里之所以不把?if(sum?==?target)?條件直接放在?for?循環內部,是因為我們只想在找到?k?個數字的組合時才檢查它們的和是否等于?target。如果提前放在循環內,那么即使組合中數字個數不足?k?個,也會進行檢查,這與題目要求不符。


2. for?循環:
? 這個循環是用來遍歷所有可能的數字組合。
? i?從?startIndex?開始,這是為了避免重復。每次遞歸調用?getCombinationSum?時,都會增加?startIndex,這樣就不會重復考慮之前的數字,保證了組合的唯一性。


3. 遞歸調用:
? 在?for?循環中,對每個數字?i,將其加入到?path?中,并更新?sum。
? 然后遞歸調用?getCombinationSum,探索包含當前數字的所有可能組合。


4. 回溯:
? 在遞歸返回后,需要撤銷之前的選擇(即從?path?中移除?i?并從?sum?中減去?i),以便于?for?循環中的下一次嘗試。
?

電話號碼的字母組合:力扣題目鏈接

給定一個僅包含數字?2-9?的字符串,返回所有它能表示的字母組合。答案可以按 任意順序 返回。

給出數字到字母的映射如下(與電話按鍵相同)。注意 1 不對應任何字母。

當我看到每個數字有與之對應的字母時,第一時間相當用哈希map,想通過鍵值對匹配來完成。

以下是第一次用HashMap寫出來的答案:

class Solution {//創建一個結果集,存放答案List<String> ans = new ArrayList<>();StringBuilder sb = new StringBuilder();public List<String> letterCombinations(String digits) {//判斷digitis,也相當于減枝了if(digits == null || digits.length() == 0){return ans;}//看到字母和數字匹配,想到了哈希map//創建一個hashmapMap<Integer,String> map = new HashMap<>(){{//把對應元素添加到map集合中put(2,"abc");put(3,"def");put(4,"ghi");put(5,"jkl");put(6,"mno");put(7,"pqrs");put(8,"tuv");put(9,"wxyz");}};back(digits,sb,0,map);return ans;}//遞歸方法:public void back(String digits,StringBuilder sb,int index,Map<Integer,String> map){//什么時候把得到的結果放到結果集中? 觀察得出,輸出的每個字符串,長度等于digits的長度if(sb.length() == digits.length()){ans.add(sb.toString());return;}        //傳入一個digits,會去解析里面的數字int number = Integer.parseInt(String.valueOf(digits.charAt(index)));String value = map.get(number);for(int i =0;i<value.length();i++){sb.append(value.charAt(i));back(digits,sb,index+1,map);//回溯:sb.deleteCharAt(sb.length()-1);}}
}

我基本是按照之前的組合問題的做法來思考的:

? 每一步遞歸都會對一個數字進行處理,將其映射到對應的所有字母,并繼續遞歸處理下一個數字。
? 當構建的字符串長度與輸入?digits?的長度相同時,將其視為一個有效組合,并加入到結果集。
? 通過回溯(移除已添加的最后一個字符),算法能夠撤銷之前的選擇,從而探索所有不同的組合路徑。

?而代碼隨想錄中用的是數組,我認為這樣更優:

class Solution {//設置全局列表存儲最后的結果List<String> list = new ArrayList<>();public List<String> letterCombinations(String digits) {if (digits == null || digits.length() == 0) {return list;}//初始對應所有的數字,為了直接對應2-9,新增了兩個無效的字符串""String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};//迭代處理backTracking(digits, numString, 0);return list;}//每次迭代獲取一個字符串,所以會設計大量的字符串拼接,所以這里選擇更為高效的 StringBuildStringBuilder temp = new StringBuilder();//比如digits如果為"23",num 為0,則str表示2對應的 abcpublic void backTracking(String digits, String[] numString, int num) {//遍歷全部一次記錄一次得到的字符串if (num == digits.length()) {list.add(temp.toString());return;}//str 表示當前num對應的字符串String str = numString[digits.charAt(num) - '0'];for (int i = 0; i < str.length(); i++) {temp.append(str.charAt(i));//cbackTracking(digits, numString, num + 1);//剔除末尾的繼續嘗試temp.deleteCharAt(temp.length() - 1);}}
}

大體思路都是相同的!

青山依舊,

韶華幾許~

Fighting!

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

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

相關文章

matlab調用python_從MATLAB調用Python函數

嘗試使用此MEX文件從MATLAB實際調用Python&#xff0c;而不是像其他人建議的那樣。它提供了相當不錯的集成&#xff1a;http : //algoholic.eu/matpy/ 您可以輕松地執行以下操作&#xff1a; [X,Y]meshgrid(-10:0.1:10,-10:0.1:10); Zsin(X)cos(Y); py_export(X,Y,Z) stmt spr…

macbook配置java環境變量_配置mac上Java環境變量

從ubuntu上轉到mac上來做開發&#xff0c;一切配置都要重新開始1. 下載jrehttp://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html選擇合適的版本和安裝包2. 一鍵安裝3. 查看是否安裝成功scarlettdeMacBook-Air:~ scarlettxu$ java -versionjava vers…

地圖 插件 html 經緯度,如何往地圖位置(經緯度)選擇插件頁面傳遞經緯度

查看了一下代碼&#xff0c;發現了解決辦法&#xff1b;在edit.html中&#xff1a;{:__(Longitude)}:{:__(Latitude)}:在對應的js代碼中&#xff1a;edit: function () {$("[data-toggleaddresspicker]").data("lat-id",c-latitude);$("[data-togglea…

python調用node_在node中執行python腳本

Node.js多進程基礎 Node.js 是以單線程的模式運行的&#xff0c;但它使用的是事件驅動來處理并發。這樣有助于我們在多核 cpu 的系統上創建多個子進程&#xff0c;從而提高性能。 每個子進程總是帶有三個流對象&#xff1a;child.stdin, child.stdout 和child.stderr。他們可能…

idea 自動生成mybaits_IDEA利用mybatis-generator自動生成dao和mapper

pom.xml配置1 2 1.83 1.3.74 5.1.465 1.1.96 1.3.27 89 10 11 org.springframework.boot12 spring-boot-starter-web13 1415 16 org.springframework.boot17 spring-boot-starter-test18 test19 20 21 org.junit.vintage22 junit-vintage-engine23 24 25 26 27 28 org.mybatis.…

計算機專業個人工作總結,年底個人工作總結計算機專業材料

《年底個人工作總結計算機專業材料.doc》由會員分享&#xff0c;可免費在線閱讀全文&#xff0c;更多與《年底個人工作總結計算機專業材料》相關文檔資源請在幫幫文庫(www.woc88.com)數億文檔庫存里搜索。1、定的進步,但我深知自己還存在些缺點和不足,理論基礎還不扎實,業務知識…

docker配置 nacos_Nacos - 阿里開源配置中心

這里是喵了個咪的后端技術分享&#xff0c;覺得寫的不錯。點個贊&#xff0c;轉發一下&#xff0c;關注一下。本文載于個人原創技術博客http://w-blog.cn&#xff0c;轉載請注明出處&#xff0c;非法轉載抄襲將追究其責任。配置中心相信大家都有聽過&#xff0c;zookeeper、apo…

樂高機器人骨奧_樂高機器人這個大坑,為啥大家都拽著孩子往里跳?

上學期我們在美國經常湊一起玩的幾家家長給自己挖了個大坑&#xff0c;因為孩子們平時都很喜歡玩樂高積木&#xff0c;而且年齡也差不多大剛升了四年級&#xff0c; 感覺是時候可以整點兒“大事”了&#xff0c;于是把他們動員起來組成了一個樂高機器人團隊&#xff0c;還任命我…

微型計算機內存主要,微型計算機的內存容量主要指 ( ) 的容量 (7.0分)

【判斷題】青藏高壓又稱南亞高壓,是暖季出現在亞洲大陸南部青藏高原上空對流層頂部的大型暖高壓系統。【問答題】電路如圖 10 所示,已知: u i1 2V,u i2 1V ,計算電路中 u o1 、u o2 、u o3 、u o 的值。【問答題】您認為大學生階段的學習生活主要由哪幾個部分構成?【判斷題】發…

jdbc獲取mysql第二行表信息_【奇技淫巧】MySQL另類方法獲取元數據信息

問&#xff1a;在進行MySQL注入時&#xff0c;我們通常是通過information_schema元數據來獲取表名、字段名信息&#xff0c;從而讀取相應數據。但是如果waf或其它過濾了information_schema關鍵字&#xff0c;那么還有什么方法可以讀取元數據信息呢&#xff1f;答&#xff1a;從…

vscode使用sass_推薦7 個 極好用的VS Code 插件

你知道將高級開發人員與普通開發人員區分的條件是什么嗎&#xff1f;沒錯&#xff0c;是所使用的工具&#xff0c;俗話說&#xff0c;"工欲善其事必先利其器"&#xff0c; 擁有正確的工作工具可以讓開發人員的生活變得更加輕松&#xff0c;甚至想寫一輩子代碼。巧的的…

劍指offer python實現_劍指Offer第2題詳解(附Python、Java代碼實現)

題目描述 請實現一個函數&#xff0c;將一個字符串中的每個空格替換成“%20”。例如&#xff0c;當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。 這個題較為簡單 1. Python實現 1.1 使用replace直接實現def replaceSpace(s): # return s.replace(" &…

挖掘城市ip_不斷挖掘IP價值,緊抓樂園經濟新機遇!

當一個國家的人均GDP達到5,000美元時&#xff0c;其旅游度假經濟將進入成熟階段。按照2018年末人口總數計算&#xff0c;我國人均GDP接近1萬美元&#xff0c;近年來&#xff0c;越來越多的主題樂園落戶中國。樂園的選址、運營有頗多講究。對主題樂園而言&#xff0c;依托大中型…

pixel和毫米怎么換算_趕緊收藏!小學階段所有公式、單位換算、數量關系

小學階段會接觸到很多公式&#xff0c;這些公式都是學習中必須要記憶的&#xff0c;筆者特意總結了小學一到六年級所有的公式、單位換算、數量關系、難題知識。孩子只要掌握了這四大知識重點&#xff0c;考試輕輕松松拿高分&#xff01;一、數量關系計算公式1、單價數量&#x…

相冊權限_手機相冊太亂?1分鐘教你快速管理自己的照片,非常好用!

喜歡拍照的朋友們是不是有這樣一個煩惱&#xff0c;那就是手機里拍了很多照片&#xff0c;當你想找某一張照片時你得在手機里翻半天&#xff0c;費時費力&#xff0c;那么今天我就來給大家解決這個煩惱&#xff0c;手機相冊是手機中必不可少的&#xff0c;那當我們手機照片太多…

學校計算機數據采集處理系統,中學化學計算機數據采集處理系統實驗室裝備

中學化學計算機數據采集處理系統實驗室裝備配置方案一、基礎型配置(31套&#xff1a;教師1套&#xff0c;學生30套(2學生/組&#xff0c;以每班60學生分組))&#xff0c;每套配置標準如下&#xff1a;序號 名稱 型號1 數據采集器 SJ-SJCJQ2 南師大分析軟件 NJSFDX-V33 電流傳感…

python爬蟲知識大全_Python爬蟲入門有哪些基礎知識點

1、什么是爬蟲 爬蟲&#xff0c;即網絡爬蟲&#xff0c;大家可以理解為在網絡上爬行的一直蜘蛛&#xff0c;互聯網就比作一張大網&#xff0c;而爬蟲便是在這張網上爬來爬去的蜘蛛咯&#xff0c;如果它遇到資源&#xff0c;那么它就會抓取下來。想抓取什么&#xff1f;這個由你…

計算機中國象棋書籍,[建議]中國的象棋永遠不能被沒有“思維”的電腦所代替(就目前的電腦象棋軟件...

[建議]中國的象棋永遠不能被沒有“思維”的電腦所代替(就目前的電腦象棋軟件有感而發)先自我介紹一下&#xff0c;本人來自上海&#xff0c;師從原江蘇省棋隊教練言穆江大師&#xff0c;現年28歲&#xff0c;無任何值得自傲的成績&#xff0c;但是我沒有感到后悔&#xff0c;因…

dplayer js控制 自動全屏_Qt編寫安防視頻監控系統18-云臺控制

一、前言云臺控制是視頻監控系統中必備的一個功能&#xff0c;對球機進行上下左右的移動&#xff0c;還有焦距的控制&#xff0c;其實核心就是控制XYZ三個坐標軸&#xff0c;為了開發這個模塊&#xff0c;特意研究了各種云臺控制的方法和開源庫比如soap&#xff0c;有些廠家使用…

css不換行屬性_那些不常見,但卻非常實用的css屬性(整理不易)

1、-webkit-line-clamp可以把 塊容器 中的內容限制為指定的行數。并且在超過行數后&#xff0c;在最后一行顯示"..."這是正常的展示display: -webkit-box; /*值必須為-webkit-box或者-webkit-inline-box*/ -webkit-box-orient: vertical; /*值必須為vertical*/ -webk…