zoukankan      html  css  js  c++  java
  • 216. Combination Sum III

    Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.

    Note:

    • All numbers will be positive integers.
    • The solution set must not contain duplicate combinations.

    Example 1:

    Input: k = 3, n = 7
    Output: [[1,2,4]]
    

    Example 2:

    Input: k = 3, n = 9
    Output: [[1,2,6], [1,3,5], [2,3,4]]

    backtracking

    time: C(m, k) = m! / k!(m-k)!

    space: O(k + k * # of ans)

    class Solution {
        public List<List<Integer>> combinationSum3(int k, int n) {
            List<List<Integer>> res = new ArrayList<>();
            backtracking(k, n, 1, new ArrayList<>(), res);
            return res;
        }
        
        private void backtracking(int k, int n, int start, List<Integer> tmp, List<List<Integer>> res) {
            if(k == 0) {
                if(n == 0)
                    res.add(new ArrayList<>(tmp));
            }
            
            for(int i = start; i <= 9; i++) {
                if(i > n) break;
                tmp.add(i);
                backtracking(k - 1, n - i, i + 1, tmp, res);
                tmp.remove(tmp.size() - 1);
            }
        }
    }

    二刷:

    time: O(2 ^ k), space: O(k)

    class Solution {
        public List<List<Integer>> combinationSum3(int k, int n) {
            List<List<Integer>> res = new ArrayList<>();
            dfs(k, n, 1, new ArrayList<>(), res);
            return res;
        }
        
        public void dfs(int k, int target, int start, List<Integer> list, List<List<Integer>> res) {
            if(k == 0) {
                if(target == 0) {
                    res.add(new ArrayList<>(list));
                }
                return;
            }
            
            for(int i = start; i <= 9; i++) {
                if(i > target) {
                    break;
                }
                list.add(i);
                dfs(k - 1, target - i, i + 1, list, res);
                list.remove(list.size() - 1);
            }
        }
    }
  • 相关阅读:
    hdoj:2075
    hdoj:2072
    hdoj:2071
    hdoj:2070
    hdoj:2069
    test001
    hdoj:2067
    hdoj:2061
    hdoj:2058
    hdoj:2057
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10078447.html
Copyright © 2011-2022 走看看