• [LeetCode] 40. Combination Sum II


    Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.

    Each number in candidates 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.

    Example 1:

    Input: candidates = [10,1,2,7,6,1,5], target = 8,
    A solution set is:
    [
      [1, 7],
      [1, 2, 5],
      [2, 6],
      [1, 1, 6]
    ]
    

    Example 2:

    Input: candidates = [2,5,2,1,2], target = 5,
    A solution set is:
    [
      [1,2,2],
      [5]
    ]

    组合总和II。跟版本一类似,不同的地方在于

    • input里面是有重复数字的
    • 结果集不能有重复的结果
    • 每个数字只能用一次

    那么这个题就需要排序了,同时helper函数中需要skip掉重复的数字,同时注意25行为什么start + 1是因为每个数字只能用一次。其余思路跟39题没有任何区别。

    时间O(2^n)

    空间O(n)

    Java实现

     1 class Solution {
     2     public List<List<Integer>> combinationSum2(int[] candidates, int target) {
     3         List<List<Integer>> res = new ArrayList<>();
     4         if (candidates == null || candidates.length == 0) {
     5             return res;
     6         }
     7         Arrays.sort(candidates);
     8         helper(res, new ArrayList<>(), candidates, target, 0);
     9         return res;
    10     }
    11 
    12     private void helper(List<List<Integer>> res, List<Integer> list, int[] candidates, int target, int start) {
    13         if (target < 0) {
    14             return;
    15         }
    16         if (target == 0) {
    17             res.add(new ArrayList<>(list));
    18             return;
    19         }
    20         for (int i = start; i < candidates.length; i++) {
    21             if (i != start && candidates[i] == candidates[i - 1]) {
    22                 continue;
    23             }
    24             list.add(candidates[i]);
    25             helper(res, list, candidates, target - candidates[i], i + 1);
    26             list.remove(list.size() - 1);
    27         }
    28     }
    29 }

    LeetCode 题目总结

  • 相关阅读:
    WCF+EntityFramework+mysql总结
    实现Win7远程桌面关机和重启
    EF 4.1 一些操作
    Ado.net利用反射执行SQL得到实体
    .net IL 指令速查
    VS2010 /VC/bin/rcdll.dll 无法找到资源编译器
    Win7下 httpRequest带证书请求https网站
    VS2010 自动关闭的问题解决方法
    Android 之 悬浮窗口
    论 Java 中获取一组不重复的随机数之性能问题
  • 原文地址:https://www.cnblogs.com/cnoodle/p/12996797.html
Copyright © 2020-2023  润新知