赞
踩
思路:DFS查找
1. 首先对数组进行排序,方便查找的时候如果当前元素加入之后超出target,那么后面的元素就不需要再加了
2.然后进行DFS查找,如果满足要求则输出到结果中
3.注意的是出现重复的组合要避免,
代码如下:
- class Solution {
- public:
- vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
- vector<int> temp;
- //进行排序
- sort(candidates.begin(),candidates.end());
- //进行dfs查找结果
- dfs(candidates,target,temp,0);
- return res;
- }
- //存放结果
- vector<vector<int>> res;
- void dfs(vector<int>& candidates, int target,vector<int> temp,int index){
- //如果目前组合里面的sum==target,则是一个符合要求的组合
- if(target==0){
- res.push_back(temp);
- return;
- }
- //进行遍历找到合适的组合
- for(int i=index;i<candidates.size();i++){
- //如果当前元素与上一个元素相等且当前i不是第一个元素,比如 1 1 1 6 第一次取了1(first) 1(second) 6,走到第二个1(second) 1(third) 6就不能再取了
- if(i > index && candidates[i]==candidates[i-1]) continue;
- //如果加入当前元素会超出target的值,则跳出,因为后面的数更大,还会超出
- if(target-candidates[i]<0) break;
- //存入当前元素
- temp.push_back(candidates[i]);
- //接着往下遍历
- dfs(candidates,target-candidates[i],temp,i+1);
- //弹出之前元素
- temp.pop_back();
- }
- return;
- }
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。