LeetCode40:求数组中所有的不重复组合

/*
题目描述:
给定一个数组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;
 }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上的追梦人

您的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值