每天一道LeetCode-----找到给定序列中所有和为某个值的集合或集合个数,序列中可以有/无重复项,集合元素顺序不同算不同集合等

Combination Sum

原题链接Combination Sum
这里写图片描述
给定一个无重复项的序列,找到所有和是target的集合,每个元素可以使用多次。


可以用深度优先(dfs),对于某个元素都有两种选择,一种是选择当前元素至少一次,一种是不选择当前元素,所以在查找集合时要分开处理。比如说,当前元素下标为1,那么

  1. 选择该元素,然后仍然从位置1开始继续进行(这保证了下次的元素下标仍然是1,还可以决定选或不选,即至少选择一次)
  2. 不选择该元素,从位置2开始继续进行

这两种情况都可以用一个循环来做,从当前位置开始遍历给定序列,对于每个元素,如果选择了那么就是情况1,如果没有选择就是情况2

代码如下

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        /* 按递增排序,递归时可以根据当前要选择的元素和target大小决定是否还需要继续 */
        std::sort(candidates.begin(), candidates.end());
        /* 结果 */
        vector<vector<int>> res;
        /* 当前找到的集合 */
        vector<int> cur;
        dfs(candidates, target, 0, cur, res);
        return res;
    }
private:
    /* 深度优先查找所有满足条件的集合,target代表和要求总和的差,为0表示找到一个集合 */
    void dfs(vector<int>& candidates, int target, int idx, vector<int>& cur, vector<vector<int>>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值