zoukankan      html  css  js  c++  java
  • LeetCode 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.
    给定一个数组和一个目标值,求出所有加起来的和等于这个目标值的组合,数组里有重复的元素,一个元素只可以用一次

    解法

    这题是Combination Sum的加强版,思路和它很像,只不过麻烦的是上一题里数组是没有重复元素的,但是这题有,所以先排序,然后得出答案后哈希判重。

    class Solution
    {
    	vector<vector<int>>	ans;
    	map<unsigned int,bool>	hash;
    
    public:
    	vector<vector<int>> combinationSum2(vector<int>& candidates, int target)
    	{
    		ans.clear();
    		hash.clear();
    		vector<int>	temp;
    
    		sort(candidates.begin(),candidates.end());
    
    		dfs(0,0,candidates,target,temp);
    		return	ans;
    	}
    
    	void	dfs(int k,int sum,vector<int>& candidates, int target,vector<int> temp)
    	{
    		if(sum == target)
    		{
    			unsigned int seed = 131;
    			unsigned int result = 0;
    			for(int i = 0;i < temp.size();i ++)
    				result = result * seed + temp[i];
    			result = result & 0x7fffffff;
    
    			if(hash.find(result) == hash.end())
    			{
    				ans.push_back(temp);
    				hash[result] = true;
    			}
    		}
    
    		for(int i = k;i < candidates.size();i ++)
    			if(sum + candidates[i] <= target)
    			{
    				temp.push_back(candidates[i]);
    				dfs(i + 1,sum + candidates[i],candidates,target,temp);
    				temp.pop_back();
    			}
    	}
    };
    
  • 相关阅读:

    决斗(Headshot )
    密码(Password)
    线性表
    hdu 5409 CRB and Graph(边双联通分量)
    无向图的边双连通分量(EBC)
    hdu 3461 Code Lock 并查集(有点难想到)★★
    hdu 1558 Segment set 计算几何+并查集★
    交表(Send a Table)
    杨辉三角与二项式定理
  • 原文地址:https://www.cnblogs.com/xz816111/p/5892392.html
Copyright © 2011-2022 走看看