欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
 }