leetcode 40组合总和II

简介: leetcode 40组合总和II

组合总和II


d66b7a9216ed4daa9b5fc3279648d107.png和39的区别是不能重复使用元素

回溯(无去重,超时)

无去重,只能在最后加入时候find查找是否存在一样,再加入

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtarcking(vector<int>& candidates, int target , int sum ,int indnx)
    {
        if(sum > target)return;
        if(sum == target)
        {
            auto it = find(result.begin(),result.end(),path);
            if(it == result.end() ) result.push_back(path);
            return;
        }
        for(int i=indnx ; i < candidates.size() && sum + candidates[i] <= target ; i++)
        {
            path.push_back(candidates[i]);
            backtarcking(candidates,target,sum+candidates[i],i+1);
            path.pop_back();
        }
        return;
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        backtarcking(candidates,target,0,0);
        return result;
    }
};

回溯去重

a3d371fda5e748abaa5285c127694494.png

去重:在同一层上,值一样的元素只能用一次。同一枝上可以多次用

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtarcking(vector<int>& candidates, int target , int sum ,int indnx)
    {
        if(sum > target)return;
        if(sum == target)
        {
            result.push_back(path);
            return;
        }
        for(int i=indnx ; i < candidates.size() && sum + candidates[i] <= target ; i++)
        {
          //发现一样的元素这一层已经用过了,直接跳过这次
            if(i > indnx && candidates[i] == candidates[i-1]) continue;
            path.push_back(candidates[i]);
            backtarcking(candidates,target,sum+candidates[i],i+1);
            path.pop_back();
        }
        return;
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        backtarcking(candidates,target,0,0);
        return result;
    }
};

二刷

class Solution {
public:
    vector<int> path;
    vector<vector<int>> result;
    int sum = 0;
    void dfs(vector<int>& candidates, int target ,int indnx)
    {
        if(sum > target) return;
        if(sum == target)
        {
            if(find(result.begin(),result.end(),path) == result.end())
                result.push_back(path);
            return;
        }
        for(int i=indnx ; i<candidates.size() && sum + candidates[i] <= target ; i++)
        {
            if(i > indnx && candidates[i] == candidates[i-1]) continue;
            path.push_back(candidates[i]);
            sum += candidates[i];
            dfs(candidates,target,i+1);
            sum -= candidates[i];
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        dfs(candidates,target,0);
        return result;
    }
};
相关文章
|
3月前
Leetcode第40题(组合总和2)
LeetCode第40题“组合总和II”的解题方法,使用了回溯法来找出所有可能的组合,并对重复元素进行了处理。
37 0
|
3月前
【LeetCode 51】216.组合总和III
【LeetCode 51】216.组合总和III
17 1
|
3月前
【LeetCode 53】39.组合总和
【LeetCode 53】39.组合总和
43 0
|
3月前
LeetCode第39题(组合总和)
LeetCode第39题要求找出一个无重复元素整数数组中所有和为给定目标数的不同组合,可以使用回溯法解决。
60 0
|
5月前
|
算法
LeetCode第40题组合总和II
LeetCode第40题"组合总和II"的解题策略,涉及排序、去重和使用标记数组避免重复组合,通过回溯法实现递归组合。
LeetCode第40题组合总和II
|
5月前
|
算法
LeetCode第39题组合总和
LeetCode第39题"组合总和"的解题思路和技巧,采用回溯法通过递归代替多层嵌套循环,有效解决组合问题。
LeetCode第39题组合总和
|
8月前
|
Java
leetcode-216:组合总和 III
leetcode-216:组合总和 III
41 0
|
8月前
|
Java
leetcode-377:组合总和 Ⅳ
leetcode-377:组合总和 Ⅳ
51 0
|
8月前
|
Java 索引
leetcode-39:组合总和
leetcode-39:组合总和
50 0
|
8月前
|
Java
leetcode-40:组合总和 II
leetcode-40:组合总和 II
60 0