• 40. Combination Sum II


    40. 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.
        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]
    ]
    
    
    

    解析

    • 这道题跟之前那道 Combination Sum 组合之和 本质没有区别,只需要改动一点点即可,之前那道题给定数组中的数字可以重复使用,而这道题不能重复使用,只需要在之前的基础上修改两个地方即可,首先在递归的for循环里加上if (i > start && num[i] == num[i - 1]) continue; 这样可以防止res中出现重复项,然后就在递归调用combinationSum2DFS里面的参数换成i+1,这样就不会重复使用数组中的数字了
    // add 40. Combination Sum ii
    class Solution_40 {
    public:
    
    	void dfs(vector<vector<int>> &vecs, vector<int> &vec, int i, int target, vector<int> &candidates)
    	{
    		if (target == 0)
    		{
    			vecs.push_back(vec);
    			return;
    		}
    		if (target < 0)
    		{
    			return;
    		}
    		// 1 1 2 5 6 (1,1,6;1 2 5)
    		for (int k = i; k < candidates.size(); k++)
    		{
    			if (k>i && candidates[k] == candidates[k - 1]) //k>0 bug
    			{
    				continue;
    			}
    			vec.push_back(candidates[k]);
    			dfs(vecs, vec, k+1, target - candidates[k], candidates);
    			vec.pop_back();
    		}
    		return;
    	}
    
    	// 默认有序
    	vector<vector<int> > combinationSum2(vector<int> &candidates, int target) {
    		vector<vector<int>> vecs;
    		vector<int> vec;
    		if (candidates.size() == 0)
    		{
    			return vecs;
    		}
    		sort(candidates.begin(), candidates.end());
    		dfs(vecs, vec, 0, target, candidates);
    
    		return vecs;
    	}
    };
    

    题目来源

  • 相关阅读:
    外观模式
    装饰器模式
    eclipse在运行main方法时在console里面报内存溢出的错误解决办法
    windows7安装node
    Eclipse-低版本离线集成svn步骤
    IDEA-JetBrains产品永久破解
    Java对字符串使用MD5进行加密(亲测有效)
    windows下的java项目打jar分别编写在windows与linux下运行的脚本( 本人亲测可用!)
    在linux中运行main方法所在的java类(亲测有效!!!)
    linux常用命令
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/8416604.html
Copyright © 2020-2023  润新知