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;
    }
};
相关文章
|
8天前
|
存储 算法
算法题解-组合总和3
算法题解-组合总和3
|
8天前
|
Java 索引
leetcode-39:组合总和
leetcode-39:组合总和
19 0
|
8天前
|
Java
leetcode-377:组合总和 Ⅳ
leetcode-377:组合总和 Ⅳ
18 0
|
8天前
|
Java
leetcode-40:组合总和 II
leetcode-40:组合总和 II
23 0
|
8天前
|
Java
leetcode-216:组合总和 III
leetcode-216:组合总和 III
21 0
|
7月前
代码随想录Day22 LeetCode T39 组合总和 T40 组合总和II T131 分割回文串
代码随想录Day22 LeetCode T39 组合总和 T40 组合总和II T131 分割回文串
20 0
|
11月前
|
机器学习/深度学习 算法 安全
LeetCode - #40 组合总和 II
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
11月前
leetcode:40.组合总和 II
给定一个数组 candidates和一个目标数 target,找出 candidates中所有可以使数字和为 target的组合。
37 0
|
11月前
leetcode:39.组合总和
给定一个无重复元素的数组 candidates和一个目标数 target,找出 candidates中所有可以使数字和为 target的组合。
45 0

热门文章

最新文章