zoukankan      html  css  js  c++  java
  • Combination Sum II

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

    Each number in C may only be used once in the combination.

    Note:

    • All numbers (including target) will be positive integers.
    • Elements in a combination (a1a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
    • The solution set must not contain duplicate combinations.

    For example, given candidate set 10,1,2,7,6,1,5 and target 8
    A solution set is: 
    [1, 7] 
    [1, 2, 5] 
    [2, 6] 
    [1, 1, 6] 

    struct Node
    {
      int key;
      int cnt;
    };
    class Solution {
    private:
        vector<Node> v;
        vector<Node> data;
        vector<vector<int> > result;
        int len;
        
        void generate(int vdep,int index,int target)
        {
            if(target<0return;
            if(target==0)
            {
                vector<int> re;
                for(int i=0;i<vdep;i++)
                    for(int j=0;j<v[i].cnt;j++)
                        re.push_back(v[i].key);
                result.push_back(re);
                return;
            }
            for(int i=index;i<len;i++)
            {
                for(int j=1;j<=data[i].cnt;j++)
                {
                    v[vdep].key=data[i].key;
                    v[vdep].cnt=j;
                    generate(vdep+1,i+1,target-v[vdep].key*j);
                }
            }
        }
    public:
        vector<vector<int> > combinationSum2(vector<int> &num, int target) 
        {
            sort(num.begin(),num.end());
            //group
            int old=0;
            Node node;
            for(int i=0;i<num.size();i++)
            {
                if(num[i]==old) data[data.size()-1].cnt++;
                else
                {
                    node.key=num[i];
                    old=node.key;
                    node.cnt=1;
                    data.push_back(node);
                }
            }
            for(int i=0;i<num.size();i++)
                v.push_back(node);
                    
            result.clear();
            
            len=data.size();
            
            generate(0,0,target);
            return result;
        }
    }; 
  • 相关阅读:
    原生代码实现Promise
    HTTP与HTTPS的区别
    windows常用命令-长期更新
    git 常用命令
    原型和原型链
    vue 中一些API 或属性的常见用法
    移动端屏幕适配
    Nuxt.js(开启SSR渲染)
    vue+element-ui 实现分页(根据el-table内容变换的分页)
    vue中引入jQuery和bootstrap
  • 原文地址:https://www.cnblogs.com/erictanghu/p/3759351.html
Copyright © 2011-2022 走看看