题解 | #加起来和为目标值的组合#

加起来和为目标值的组合

http://www.nowcoder.com/practice/75e6cd5b85ab41c6a7c43359a74e869a

   整体思路很简单。一个一个往后加,直到和等于目标值。这其中,若当前和会大于目标值,则跳过当前数组值,与下一个相加。若当前和小于目标值,则继续往后加下一个数。另外一点就是,去重操作,要注意判重条件的确定。此处,因为每次加和时,开头的第一个数可以重复使用,故而通过i > m,判断是否为第一个数。若不为,判断该数是否与前一个数相等,若相等,则考虑后可知,结果会出现重复。就算存在用num[i - 1]时,也用到了num[i],且num[i]后不再有与num[i - 1]相等的数的这种情况,也已经被考虑在了num[i]中,不会有遗漏,故而放心去重即可。
class Solution {
private:
    vector<vector<int>> ans;
    vector<int> res;
public:
    void Dfs(vector<int> &num, int target, int m, int cur) {
        if (cur == target) {
            ans.push_back(res);
            return ;
        }
        else {
            for (int i = m; i < num.size(); i++) {
                if (cur + num[i] > target)
                    continue;
                if (i > m && num[i-1] == num[i])
                    continue;
                else {
                    res.push_back(num[i]);
                    Dfs(num, target, i + 1, cur + num[i]);
                    res.pop_back();
                }

            }
        }
    }
    vector<vector<int> > combinationSum2(vector<int> &num, int target) {
        sort(num.begin(), num.end());
        Dfs(num, target, 0, 0);
        return ans;
    }
};
全部评论

相关推荐

白火同学:1、简历可以浓缩成一页,简历简历先要“简”方便HR快速过滤出有效信息,再要“历”用有效信息突出个人的含金量。 2、教育背景少了入学时间~毕业时间,HR判断不出你是否为应届生。 3、如果你的平台账号效果还不错,可以把账号超链接或者用户名贴到对应位置,一是方便HR知道你是具体做了什么内容的运营,看到账号一目了然,二是口说无凭,账号为证,这更有说服力。
面试被问期望薪资时该如何...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务