LeetCode40:求数组中所有的不重复组合
程序员文章站
2024-03-15 18:49:42
...
/*
题目描述:
给定一个数组candidates和一个目标数target,找出candidates中所有可以使
数字和为target的组合.candidate中的每个数字在每个组合中只能使用一次.
注意:所有数字(包括目标数字)都是正整数.解集不能包含重复的组合.
示例 1:
Input:candidates=[10,1,2,7,6,1,5],target=8
Output:[[1,7],[1,2,5],[2,6],[1,1,6]]
示例 2:
Input:candidates=[2,5,2,1,2],target=5
Output:[[1,2,2],[5]]
解题思路:
回溯+剪枝即可,在递归的时候设置下次能够使用的candidates的索引值为i+1就行,
这样可以保证每个数字在一个组合中只会出现一次.除此之外,还需要判断二维数组中
是否存在重复的,因为candicates可能存在相同的数字.
*/
C++ 实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution{
public:
Solution(vector<int>& _candidates,const int& _target):candidates(_candidates),target(_target){}
vector<vector<int>> combinationSum(){
if(candidates.empty())
return {{}};
sort(candidates.begin(),candidates.end());
vector<int> temp;
dfs(candidates,0,0,temp);
return ans;
}
private:
vector<int> candidates;
const int target;
vector<vector<int>> ans;
void dfs(vector<int>& candidates,int value,int index,vector<int>& temp){
if(value>target)
return ;
else if(value==target){
ans.push_back(temp);
}else{
/*index的作用为剪去那些下边枝条值小于上边枝条值的分支*/
for(auto i=index;i<candidates.size();i++){
/*避免ans中存在相同的一维数组*/
if(i>index&&candidates[i]==candidates[i-1])
continue;
temp.push_back(candidates[i]);
dfs(candidates,value+candidates[i],i+1,temp);
temp.pop_back();
}
}
}
};
int main(int argc,char* argv[]){
vector<int> candidates={10,1,2,7,6,1,5};
const int target=8;
vector<vector<int>> ans=Solution(candidates,target).combinationSum();
for_each(ans.begin(),ans.end(),[](vector<int>& result){
cout<<"["<<" ";
for(auto& i:result)
cout<<i<<" ";
cout<<"]"<<endl;
});
return 0;
}
下一篇: 用递归法求N的阶乘Java