• [LeetCode] Combination Sum (bfs)


    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 (a1, a2, … , ak) must be in non-descending order. (ie, a1a2 ≤ … ≤ 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]

    方法:用queue实现bfs

    class Solution {
    public:
        vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
            vector<vector<int> > result;
             
            if(candidates.size()==0){    
              vector<int> tmp;
               result.push_back(tmp);
               return result;
            }    
            sort(candidates.begin(),candidates.end());
           
    
            bfs(result,candidates,target);
            return result;
        }//end func
    
    private:
        void bfs(vector<vector<int> > &result,vector<int> &candidates,int target){
            queue<vector<int> > q;
            int len = candidates.size();
            for(int i = 0;i<len;i++){
                int sum = 0;
                int value = candidates[i];
                vector<int> tmp;
                while(true){
                    sum += value;
                    tmp.push_back(value);
                    if(sum<target){       
                       q.push(tmp); 
                    }else if(sum == target){
                       if(find(result.begin(),result.end(),tmp)==result.end())
                           result.push_back(tmp);
                    }   
                    else 
                        break;
                }
                
                while(!q.empty()){
                    tmp = q.front();
                    q.pop();
                    sum = 0;
                    for(int k=0;k<tmp.size();k++){
                        sum += tmp[k];
                    }
                    int sum0 = sum;
                    vector<int> tmp0(tmp);
                    for(int j=i+1;j<len;j++){
                        value = candidates[j];
                        while(true){
                            sum += value;
                            tmp.push_back(value);
                            if(sum<target){       
                                q.push(tmp);
                            }else if(sum == target){
                                sort(tmp.begin(),tmp.end());
                                if(find(result.begin(),result.end(),tmp)==result.end())
                                    result.push_back(tmp);
                            }    
                            else 
                                break;
                        }
                        sum = sum0;
                        tmp = tmp0;
                    }
                }                   
            }//end for        
        }//end func
    };
  • 相关阅读:
    centos下两种方法安装git
    Field.setAccessible()方法
    Tomcat日志格式自定义
    Java监控工具
    JDK目录结构和文件作用介绍
    Java中堆和栈的区别
    Magicodes.WeiChat——使用AntiXssAttribute阻止XSS(跨站脚本攻击)攻击
    Magicodes.WeiChat——缓存管理
    Magicodes.WeiChat——WeChatOAuthTest(网页授权获取用户基本信息)
    Magicodes.WeiChat——后台JS框架封装
  • 原文地址:https://www.cnblogs.com/Xylophone/p/3933636.html
Copyright © 2020-2023  润新知