日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[力扣leetcode39]组合总和及回溯法

發(fā)布時(shí)間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [力扣leetcode39]组合总和及回溯法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[力扣leetcode39]組合總和及回溯法

  • 回溯yyds
  • 小練習(xí)

回溯yyds

在算法優(yōu)化上面回溯法或許沒有那么引人注意,但是對(duì)于一些題目來說能夠回溯已經(jīng)很好了。

題目:給定一個(gè)無重復(fù)元素的數(shù)組 candidates 和一個(gè)目標(biāo)數(shù) target ,找candidates 中所有可以使數(shù)字和為 target 的組合。candidates 中的數(shù)字可以無限制重復(fù)被選取。
比如輸入:candidates = [2,3,6,7], target = 7,
所求解集為:
[
[7],
[2,2,3]
]

對(duì)于這道題目最樸素的解法當(dāng)然是暴力搜索,但是其實(shí)組合類問題一直都是回溯法的天下,可以排除一些沒有必要的驗(yàn)證。回溯法的本質(zhì)我個(gè)人認(rèn)為是一個(gè)樹,不妨以上述的輸入為例。

第一輪2,3,6,7都可以選,如果第一輪選了2,第二輪可以選2,3,因?yàn)楸仨氁獫M足每一輪取的數(shù)必須大于等于上一輪取的數(shù),這樣可以避免重復(fù),同時(shí)不需要取6,7,因?yàn)橐獫M足總和為7。如果第二輪取了2,第三輪可以取2,3,先驗(yàn)證2,不滿足且不能繼續(xù)取了,回溯上一輪再取3,發(fā)現(xiàn)滿足題意,即找到一個(gè)組合。所以思路就來了,用for循環(huán)遍歷元素,再用回溯法。回溯法有個(gè)明顯的格式是進(jìn)棧(或者其他容器)->回溯->出棧。需要額外注意的是startindex的選取,本題每一輪選取的數(shù)都要大于等于上一輪的數(shù)。

class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {if (sum > target) {return;}if (sum == target) {result.push_back(path);return;}for (int i = startIndex; i < candidates.size(); i++) {sum += candidates[i];path.push_back(candidates[i]);backtracking(candidates, target, sum, i); sum -= candidates[i];path.pop_back();}} public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {result.clear();path.clear();backtracking(candidates, target, 0, 0);return result;} };

小練習(xí)

因?yàn)樯蠈W(xué)期離散學(xué)到了球和盒子的問題,比較難的是把不可辨別的球放到不可辨別的盒子里面,典型的就是自然數(shù)的組合問題,比如3,可以有1+1+1,1+2,兩種組合方式。這個(gè)問題也可以用回溯法解決。

vector<vector<int>> res; vector<int> vec; void back(int n,int cur){int sum=accumulate(vec.begin(),vec.end(),0);if(sum==n){res.push_back(vec);return;}for(int i=cur;i<n;i++){if(i+sum<=n)vec.push_back(i);else return;back(n,i);vec.pop_back();}}int main(){int n=6;back(n,1);for(int i=0;i<res.size();i++){for(int j=0;j<res[i].size();j++){cout<<res[i][j];}cout<<endl;} }

總結(jié)

以上是生活随笔為你收集整理的[力扣leetcode39]组合总和及回溯法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。