zoukankan      html  css  js  c++  java
  • Combination Sum

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

    The same repeated number may be chosen from C unlimited number of times.

    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 2,3,6,7 and target 7
    A solution set is: 
    [7] 
    [2, 2, 3] 

    class Solution {
    public:
        vector<vector<int> > combinationSum(vector<int> &candidates, int target) 
        {
            //sort candidates
            int size=candidates.size();
            for(int i=0;i<size;i++)
                for(int j=i+1;j<size;j++)
                    if(candidates[i]>candidates[j])
                    {
                        int tmp=candidates[i];
                        candidates[i]=candidates[j];
                        candidates[j]=tmp;
                    }
            //dfs
            vector<vector<int>> result;
            if(size==0return result;
            
            int v[target/candidates[0]];
            int cdep=0;
            int vdep=0;
            dfs(result,candidates,size,v,cdep,vdep,target);
            return result;
        }
        
        void dfs(vector<vector<int>>& result,vector<int> &candidates,int& csize,int* v,int& cdep,int& vdep,int& target)
        {
            if(target==0)
            {
                vector<int> vals;
                for(int i=0;i<vdep;i++)
                    vals.push_back(v[i]);
                result.push_back(vals);
                return;
            }
            if(cdep==csize || target<candidates[cdep]) return;
            
            int dup=target/candidates[cdep];
            for(int i=0;i<=dup;i++)
            {
                //add to v
                for(int j=0;j<i;j++) v[vdep+j]=candidates[cdep];
                //search next candidate
                target=target-i*candidates[cdep];
                cdep=cdep+1;
                vdep=vdep+i;
                dfs(result,candidates,csize,v,cdep,vdep,target);
                vdep=vdep-i;
                cdep=cdep-1;
                target=target+i*candidates[cdep];
            }
        }
    }; 
  • 相关阅读:
    [并发编程] 进程、线程
    100. 相同的树
    Python 问题集
    this关键字在函数中的应用
    去除列表右边框
    JS——作用域
    javascript——值传递!!
    null和undefined的区别?
    浏览器内核——四大主流
    http常用状态码
  • 原文地址:https://www.cnblogs.com/erictanghu/p/3759348.html
Copyright © 2011-2022 走看看