leetcode 39題 組合總數(c++)

題目描述:

給定一個無重複元素的數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和爲 target 的組合。

candidates 中的數字可以無限制重複被選取。

說明:

  • 所有數字(包括 target)都是正整數。
  • 解集不能包含重複的組合。 

示例 1:

輸入: candidates = [2,3,6,7], target = 7,
所求解集爲:
[
  [7],
  [2,2,3]
]

示例 2:

輸入: candidates = [2,3,5], target = 8,
所求解集爲:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

解題思路:

這個題是用DFS解的。先對數進行排序,然後每一次選擇的數爲一層,如第一次我選了2或3或6或7,則這一層的一個節點就爲2或3或6或7。

代碼:

注意的點:

1.要注意剪枝,剪枝條件爲 target - candidates[i] < 0。

2.對每個數的下一層選擇,都不選擇比它小的數,要不就會有重複的答案。

class Solution {
public:
	vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
		vector<vector<int>> result;
		vector<int> tmp;
        sort(candidates.begin(),candidates.end());
		getSum(candidates, target, result, tmp,0);
		return result;
	}
	void getSum(vector<int> candidates, int target, vector<vector<int>> &result, vector<int> &tmp,int start) {
		if (target == 0)
		{
			result.push_back(tmp);
			return;
		}

		for (int i = start; i < candidates.size(); i++)
		{			
			tmp.push_back(candidates[i]);			
			if (target - candidates[i] < 0)
			{
				tmp.pop_back();
				break;
			}
			getSum(candidates, target - candidates[i], result, tmp, i);
			tmp.pop_back();
		}
		return;
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章