LeetCode40 组合总和 II

前言

题目: 40. 组合总和 II
文档: 代码随想录------组合总和 II
编程语言: C++
解题状态: 没思路...

思路

所谓去重,其实就是使用过的元素不能重复选取。在树形结构中,"使用过"在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。

代码

cpp 复制代码
class Solution {
private:
    vector<vector<int>> res;
    vector<int> path;
    void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool> used) {
        if (sum == target) {
            res.push_back(path);
            return;
        }
        for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
            if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {
                continue;
            }
            sum += candidates[i];
            path.push_back(candidates[i]);
            used[i] = true;
            backtracking(candidates, target, sum, i + 1, used);
            used[i] = false;
            sum -= candidates[i];
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        vector<bool> used(candidates.size(), false);
        path.clear();
        res.clear();
        sort(candidates.begin(), candidates.end());
        backtracking(candidates, target, 0, 0, used);
        return res;
    }
};
  • 时间复杂度: O ( n ∗ 2 n ) O(n*2^n) O(n∗2n)
  • 空间复杂度: O ( n ) O(n) O(n)
相关推荐
[J] 一坚16 小时前
深入浅出理解冒泡、插入排序和归并、快速排序递归调用过程
c语言·数据结构·算法·排序算法
czlczl2002092516 小时前
算法:二叉搜索树的最近公共祖先
算法
司铭鸿16 小时前
祖先关系的数学重构:从家谱到算法的思维跃迁
开发语言·数据结构·人工智能·算法·重构·c#·哈希算法
yk0820..16 小时前
测试用例的八大核心要素
数据结构
sulikey17 小时前
C++ 四十年:一段跨越时代的语言旅程
c++·c++40周年
SoleMotive.17 小时前
redis实现漏桶算法--https://blog.csdn.net/m0_74908430/article/details/155076710
redis·算法·junit
-森屿安年-17 小时前
LeetCode 283. 移动零
开发语言·c++·算法·leetcode
北京地铁1号线17 小时前
数据结构:堆
java·数据结构·算法
得物技术17 小时前
从数字到版面:得物数据产品里数字格式化的那些事
前端·数据结构·数据分析
散峰而望18 小时前
C++数组(一)(算法竞赛)
c语言·开发语言·c++·算法·github