回溯算法之组合问题:
216.组合总和III
class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking(int k,int n,int t,int sum){if(path.size()==k){if(sum==n)result.push_back(path);return;}for(int i=t;i<=9;++i){path.push_back(i);backtracking(k,n,i+1,sum+i);path.pop_back();}}vector<vector<int>> combinationSum3(int k, int n) {result.clear();path.clear();backtracking(k,n,1,0);return result;}
};
剪枝操作:即累加的和还没到k个数的时候,就已经大于目标值了,这个时候就不需要再累加下去了,直接返回!另外一个地方就与组合那道题一样的地方进行剪枝!
class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking(int k,int n,int t,int sum){if(sum>n)return;if(path.size()==k){if(sum==n)result.push_back(path);return;}for(int i=t;i<=9- (k - path.size()) + 1;++i){path.push_back(i);backtracking(k,n,i+1,sum+i);path.pop_back();}}vector<vector<int>> combinationSum3(int k, int n) {result.clear();path.clear();backtracking(k,n,1,0);return result;}
};
17.电话号码的字母组合
思路:其实这道题我感觉回溯倒不是难点,难点在于如何处理从
digits
中取出每一个字符的映射到对应的组合上去!这里我一直没处理好!
class Solution {
private:
const string letterMap[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz",
};
public:vector<string> result;string path;void backtracking(const string& digits ,int index){if(index==digits.size()){result.push_back(path);return;}int digit=digits[index]-'0';string letter=letterMap[digit];for(int i=0;i<letter.size();++i){path.push_back(letter[i]);backtracking(digits,index+1);path.pop_back();}}vector<string> letterCombinations(string digits) {result.clear();path.clear();if(digits.size()==0){return result;}backtracking(digits,0);return result;}
};