leetcode日记(30)组合总和Ⅱ

一开始我低估了这题的难度,以为用贪心算法或者上一题的解法就能做出来TT后来发现很多做法会得出重复解,只能另辟蹊径了...!

想出来的解法是先将candidates中重复的元素提出来用数组记录重复的个数,然后将重复的元素去掉,接着用原来(上一题)的方法依次遍历元素,如果能取该元素就继续遍历该元素,不能取就全部跳过,最终可以得到正确解。

cpp 复制代码
class Solution {
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target){
        vector<vector<int>> v;
        vector<int> vec;
        sort(candidates.begin(),candidates.end());
        vector<int> g(candidates[candidates.size()-1]+1);
        int u=0;
        for(int i=candidates.size()-1;i>=0;i--){
            while(i>=1&&candidates[i]==candidates[i-1]){
                i--;
                g[candidates[i]]++;
            }
        }
        for(int i=0;i<g.size();i++) cout<<g[i]<<" ";
        candidates.erase(unique(candidates.begin(), candidates.end()), candidates.end());
        hs(candidates,target,v,vec,candidates.size()-1,g);
        return v;
    }
    void hs(vector<int> candidates, int target,vector<vector<int>>& v,vector<int> vec,int x,vector<int> g){
        while(x>1&&candidates[x]==candidates[x-1]) x--;
        for(;x>=0;x--){
            if(candidates[x]<target){
                vec.push_back(candidates[x]);
                if(g[candidates[x]]>0){
                    g[candidates[x]]--;
                    hs(candidates,target-candidates[x],v,vec,x,g);
                    g[candidates[x]]++;
                }
                else hs(candidates,target-candidates[x],v,vec,x-1,g);
                vec.pop_back();
            }
            else if(candidates[x]==target){
                vec.push_back(candidates[x]);
                v.push_back(vec);
                vec.pop_back();
            }
        }
    }
};
相关推荐
格林威4 分钟前
多相机重叠视场目标关联:解决ID跳变与重复计数的 8 个核心策略,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·分类·工业相机
郝学胜-神的一滴5 分钟前
深入理解网络分层模型:数据封包与解包全解析
linux·开发语言·网络·程序人生·算法
永远都不秃头的程序员(互关)5 分钟前
【K-Means深度探索(九)】K-Means与数据预处理:特征缩放与降维的重要性!
算法·机器学习·kmeans
源代码•宸11 分钟前
Golang原理剖析(逃逸分析)
经验分享·后端·算法·面试·golang··内存逃逸
重生之后端学习17 分钟前
25. K 个一组翻转链表
java·数据结构·算法·leetcode·职场和发展
CoderCodingNo24 分钟前
【GESP】C++五级练习题 luogu-P2242 公路维修问题
开发语言·c++·算法
零售ERP菜鸟32 分钟前
IT年度商业计划书框架(精简版)
大数据·人工智能·职场和发展·创业创新·学习方法·业界资讯
不知名XL32 分钟前
day30 动态规划03
算法·动态规划
张祥64228890432 分钟前
线性代数本质笔记十二
人工智能·算法·机器学习
程序员-King.32 分钟前
day157—回溯—括号生成(LeetCode-22)
算法·leetcode·回溯