78
这道题是回溯的解法,之前回溯都是根据遍历得到的长度等于数组的长度时就返回,这里数组的长度其实是变化的,所以这里用一个for循环来表示数组长度的变化,之后在for循环内按照正常的回溯就行。
17
这道题的整体思想还是回溯,回溯的部分的求解和以往的回溯题目是一样,这道题在回溯里面加入了哈希表搜索。将输入的整个数字当作一个数组,对数字建立一个哈希表。之后用index标识当前位置的,然后通过哈希表求得数字对应的字母,针对这个字母进行回溯。以往是给出一个数组来回溯出与数组大小相同的排列或者组合,这里将原来一个数字对应一个元素换成了一个数组对应三个元素,只需要在每个数字里面再添加一层循环就行了。
39
这道题和常规的递归题目是类似的,只是上一层使用过的元素这一层还可以继续使用,所以在回溯的时候,传入的参数从i开始,而不是从i+1开始。注意,在多次求解中,我总会得到重复的组合(相同的数字有不同的排列顺序),这是因为在调用写的回溯函数时,传入的下标应该从当前下标开始,而不是一开始的下标,从当前下标开始,那么之前已经回溯过的节点就不会再回溯了,具体反映在backtrack函数中传入的是i,不是index。
class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
void backtrace(vector<int>& candidates,int target,int sum,int index)
{
if(sum>target)
{
return ;
}
if(sum==target)
{
ans.push_back(path);
return ;
}
for(int i=index;i<candidates.size();i++)
{
sum+=candidates[i];
path.push_back(candidates[i]);
backtrace(candidates,target,sum,i);
path.pop_back();
sum-=candidates[i];
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
backtrace(candidates,target,0,0);
return ans;
}
};