leetcode日记(30)组合总和Ⅱ

leetcode日记(30)组合总和Ⅱ_第1张图片

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

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

class Solution {
public:
    vector> combinationSum2(vector& candidates, int target){
        vector> v;
        vector vec;
        sort(candidates.begin(),candidates.end());
        vector 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 candidates, int target,vector>& v,vector vec,int x,vector g){
        while(x>1&&candidates[x]==candidates[x-1]) x--;
        for(;x>=0;x--){
            if(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();
            }
        }
    }
};

你可能感兴趣的:(leetcode,算法,职场和发展)