zoukankan      html  css  js  c++  java
  • [leetcode] 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 (a1, a2, … , ak) must be in non-descending order. (ie, a1a2 ≤ … ≤ ak).
    • The solution set must not contain duplicate combinations.

    For example, given candidate set2,3,6,7and target7,
    A solution set is:
    [7]

    [2, 2, 3]

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

    思路:返回所有可能,只能枚举了,先排序,然后此题每个元素可以取多次,所以递归下一层的时候选取的元素不变(区别Combination Sum II 中递归下一层只能从后面元素选取)。

    import java.util.ArrayList;
    import java.util.Arrays;
    
    public class Solution {
    	public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates,
    			int target) {
    		ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
    		if (candidates == null || candidates.length == 0)
    			return result;
    
    		int n = candidates.length;
    
    		Arrays.sort(candidates);
    		ArrayList<Integer> list = new ArrayList<Integer>();
    
    		dfs(0, candidates, 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, a, num - a[i], list, result);
    					list.remove(list.size() - 1);
    				}
    			}
    
    		}
    	}
    
    	public static void main(String[] args) {
    		System.out.println(new Solution().combinationSum(
    				new int[] { 2, 3, 6, 7 }, 7));
    		System.out.println(new Solution().combinationSum(
    				new int[] { 1, 3, 6, 7 }, 7));
    
    		System.out.println(new Solution().combinationSum(
    				new int[] { 7,3,2 }, 18));
    	}
    
    }


    第二遍记录:

    注意去重的方法,先排序,然后判断,类似permutation的去重,if (i == start || candidates[i] != candidates[i - 1])

    注意新的start的设置。  

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class Solution {
        public List<List<Integer>> combinationSum(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,表示只能从以选中元素及其后面玄素开始选。
                        combine(candidates, res, tmp, target - candidates[i], i);
                        tmp.remove(tmp.size() - 1);
                    }
                }
    
            }
        }
    
        public static void main(String[] args) {
            System.out.println(new Solution().combinationSum(new int[] { 2, 3, 6, 7 }, 7));
            System.out.println(new Solution().combinationSum(new int[] { 1, 1, 1, 2, 2 }, 10));
        }
    
    }

    第三遍: 注意去重。 

    参考:

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

  • 相关阅读:
    调用微信上传图片的接口
    jqgrid取消列排序
    jqGrid动态添加列
    jqgrid多次调用合并表头出现重叠的处理
    echarts3.0版本断点连线的处理
    JAVA数据转换常用方法
    Java面试常见各种概念区别比较
    Python从零开始(1)新手常问
    记录一下11月份的面试
    Centos7 下安装 mysql8
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3810748.html
Copyright © 2011-2022 走看看