leetcode 39. 组合总和 思考分析
生活随笔
收集整理的這篇文章主要介紹了
leetcode 39. 组合总和 思考分析
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目錄
- 1、題目
- 2、思考分析
- 3、未經(jīng)優(yōu)化代碼
- 4、剪枝優(yōu)化
1、題目
給定一個(gè)無重復(fù)元素的數(shù)組 candidates 和一個(gè)目標(biāo)數(shù) target ,找出 candidates 中所有可以使數(shù)字和為 target 的組合。
candidates 中的數(shù)字可以無限制重復(fù)被選取。
2、思考分析
解空間樹寬度部分即數(shù)組 candidates內(nèi)集合,深度取決于target.
一開始的重復(fù)元素理解錯(cuò)誤了,每層循環(huán)都從0開始:
for(int i=0;i<=candidates.size();i++)
這樣是不對(duì)的,會(huì)產(chǎn)生重復(fù)組合。
我們?nèi)匀恍枰捎胹tartindex作為for起始位置,不過對(duì)于下一層我們的startindex不是startindex+1,而是仍然是startindex,這樣才能重復(fù)取相同元素。
| 圖1 for從0開始 | 圖2 for從i開始 |
3、未經(jīng)優(yōu)化代碼
class Solution { public:vector<vector<int>> result;vector<int> res;int sum;void clear_solution_param(){result.clear();res.clear();sum=0;}void backtracking(vector<int>& candidates,int startindex,int n){ if(sum > n) return;if(sum == n){result.push_back(res);return;}for(int i=startindex;i<candidates.size();i++){//處理結(jié)點(diǎn);res.push_back(candidates[i]);sum+=candidates[i];//遞歸,探索下一層backtracking(candidates,i,n); //遞歸sum-=candidates[i];//回溯,撤銷處理結(jié)果res.pop_back();}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {clear_solution_param();backtracking(candidates,0,target);return result;} };4、剪枝優(yōu)化
先對(duì)數(shù)組進(jìn)行排序,這樣集合元素排列就是有序的了,方便剪枝。(這個(gè)在回溯法中經(jīng)常用到)
對(duì)于同一層的for循環(huán),如果sum加上此時(shí)的候選元素的和大于target則沒有必要繼續(xù)深入下去了。
總結(jié)
以上是生活随笔為你收集整理的leetcode 39. 组合总和 思考分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 242. 有效的字母异
- 下一篇: leetcode 40. 组合总和 II