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

这篇博客介绍了LeetCode中的四道组合之和问题,包括Combination Sum系列,讨论如何利用深度优先搜索(DFS)解决这些问题。在面对序列中有重复元素的情况时,提出只需考虑重复项的第一个元素,以避免重复集合的出现。对于Combination Sum IV,通过动态规划避免了重复计算,提高了效率。博客内容详细展示了每道题目的解题思路和代码实现。
摘要由CSDN通过智能技术生成

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>>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值