40. Combination Sum II

来源:互联网 发布:java教程电子书下载 编辑:程序博客网 时间:2024/06/04 07:23

1、题目描述

给一个数组和一个target,找出所有不同的数组集合,使得集合中的数字之和为target。每个数字只能用一次。


2、思路

与Combination Sum I差不多回溯。

不同点:

1、数组元素不可以重复使用,那么下一次调用同一dfs函数的时候要注意起始位置+1.

2、输入的数组是有重复元素的,要使得答案都是unique的,那么每次dfs都要确保起始位置与前一位置的数字不同,

所以先将数组排序,起始位置的数字大于前面位置的数字即可。


3、代码

vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {        sort(candidates.begin(),candidates.end());        vector<vector<int>> ans;        vector<int>v;        dfs(ans,candidates,v,target,0);        return ans;    }    void dfs(vector<vector<int>>& ans,vector<int>& candidates,vector<int>& v, int target,int start){        if(target==0){            ans.push_back(v);            return;        }        else if(target<0)            return;                for(int i=start;i<candidates.size();i++){            if(i==start||candidates[i]>candidates[i-1]){                v.push_back(candidates[i]);                dfs(ans,candidates,v,target-candidates[i],i+1);                v.pop_back();             }                          }    }


原创粉丝点击