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.

    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 set10,1,2,7,6,1,5and target8,
    A solution set is:
    [1, 7]
    [1, 2, 5]
    [2, 6]

    [1, 1, 6]

    https://oj.leetcode.com/problems/combination-sum-ii/

    import java.util.ArrayList;
    import java.util.Arrays;
    
    public class Solution {
    	public ArrayList<ArrayList<Integer>> combinationSum2(int[] num,
    			int target) {
    		ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
    		if (num == null || num.length == 0)
    			return result;
    
    		int n = num.length;
    
    		Arrays.sort(num);
    		ArrayList<Integer> list = new ArrayList<Integer>();
    
    		dfs(0, num, target, list, result);
    
    		return result;
    	}
    
    	private void dfs(int level, int[] a, int num, ArrayList<Integer> list,
    			ArrayList<ArrayList<Integer>> result) {
    		if (num == 0) {
    			result.add(new ArrayList<Integer>(list));
    		} else if (num < 0)
    			return;
    		else {
    			for (int i = level; i < a.length; i++) {
    				if (a[i] <= num) {
    					list.add(a[i]);
    					dfs(i + 1, a, num - a[i], list, result);
    					list.remove(list.size() - 1);
    					while (i < a.length - 1 && a[i] == a[i + 1])
    						i++;
    				}
    
    			}
    
    		}
    	}
    
    	public static void main(String[] args) {
    		System.out.println(new Solution().combinationSum2(new int[] { 10, 1, 2,
    				7, 6, 1, 5 }, 8));
    		System.out.println(new Solution().combinationSum2(new int[] { 1, 1, 1,
    				2, 2 }, 3));
    	}
    
    }

    第二遍记录:

    相比上题目,只修改了一个地方,新的start=i+1,表示下个元素从后面取。

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class Solution {
        public List<List<Integer>> combinationSum2(int[] candidates, int target) {
            List<List<Integer>> res = new ArrayList<List<Integer>>();
            if (candidates == null || candidates.length == 0)
                return res;
            Arrays.sort(candidates);
            List<Integer> tmp = new ArrayList<Integer>();
            combine(candidates, res, tmp, target, 0);
            return res;
        }
    
        private void combine(int[] candidates, List<List<Integer>> res, List<Integer> tmp, int target, int start) {
            if (target < 0)
                return;
            if (target == 0) {
                res.add(new ArrayList<Integer>(tmp));
                return;
            } else {
                for (int i = start; i < candidates.length; i++) {
                    // 注意这步的去重
                    if (i == start || candidates[i] != candidates[i - 1]) {
                        tmp.add(candidates[i]);
                        // 注意新的start是i+1,表示只能从以选中元素的后面玄素开始选。
                        combine(candidates, res, tmp, target - candidates[i], i + 1);
                        tmp.remove(tmp.size() - 1);
                    }
                }
    
            }
        }
    
        public static void main(String[] args) {
            System.out.println(new Solution().combinationSum2(new int[] { 1, 1, 1, 1, 3, 6, 7 }, 5));
            System.out.println(new Solution().combinationSum2(new int[] { 10, 1, 2, 7, 6, 1, 5 }, 8));
        }
    
    }

    参考:

    http://blog.csdn.net/linhuanmars/article/details/20829099

  • 相关阅读:
    Window frames[]集合(转)
    ObjectDataSource 如何传递查询参数
    前台如何解析json格式 以及后台如何生成json格式
    Burrows–Wheeler transform
    windows xp中安装PadWalker
    ORA01207:文件比控制文件更新 旧的控制文件
    如何看懂NCBI BLAST输出结果
    Perl getopts
    blast formatdb 使用方法介绍
    Randfold安装
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3810749.html
Copyright © 2011-2022 走看看