LeetCode 题解(119): Combination Sum III

题目:

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

Ensure that numbers within the set are sorted in ascending order.


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。注意每次递归是只用传进比当前使用数大的数,以避免重复和无序。

C++版:

class Solution {
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        vector<vector<int>> results;
        if(k < 1 || n < 1 || k * 9 <= n)
            return results;
        
        set<int> number;
        for(int i = 1; i <= 9; i++)
            number.insert(i);
        vector<int> result;
        for(int i = 1; i <= 9; i++) {
            result.push_back(i);
            auto ub = number.upper_bound(i);
            set<int> newNumber(ub, number.end());
            sumRe(result, results, newNumber, k-1, n-i);
            result.pop_back();
        }
        return results;
    }
    
    void sumRe(vector<int> result, vector<vector<int>>& results, set<int> number, int k, int n) {
        vector<int> local = result;
        if(k == 1) {
            if(number.find(n) != number.end()) {
                local.push_back(n);
                results.push_back(local);
            }
            return;
        }
        
        for(auto i : number) {
            local.push_back(i);
            auto ub = number.upper_bound(i);
            set<int> newNumber(ub, number.end());
            sumRe(local, results, newNumber, k-1, n-i);
            local.pop_back();
        }
    }
};

Java版:

import java.util.SortedSet;

public class Solution {
    public List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> results = new ArrayList<List<Integer>>();
        if(k < 1 || n < k || k * 9 <= n)
            return results;

        List<Integer> result = new ArrayList<>();
        SortedSet<Integer> number = new TreeSet<>();
        for(int i = 1; i <= 9; i++)
            number.add(i);
        for(int i = 1; i <= 8; i++) {
            result.add(i);
            sumRe(results, result, number.subSet(i+1, 10), k - 1, n - i);
            result.clear();
        }

        return results;
    }

    void sumRe(List<List<Integer>> results, List<Integer> result, SortedSet<Integer> number, int k, int n) {
        if(k == 1) {
            if(number.contains(n)) {
                result.add(n);
                List<Integer> local = new ArrayList<>();
                for(Integer i : result)
                    local.add(i);
                results.add(local);
                result.remove(result.indexOf(n));
            }
            return;
        }

        for(int i = number.first(); i <= 8; i++) {
            result.add(i);
            sumRe(results, result, number.subSet(i+1, 10), k - 1, n - i);
            result.remove(result.indexOf(i));
        }
    }
}

Python版:

class Solution:
    def __init__(self):
        self.x = []
        self.r = []
    # @param {integer} k
    # @param {integer} n
    # @return {integer[][]}
    def combinationSum3(self, k, n):
        if k == 1:
            return [n]

        if k * 9 <= n:
            return []

        number = [1,2,3,4,5,6,7,8,9]
        for i in number:
            self.r.append(i)
            self.sumRe(self.r, k-1, n-i, number[number.index(i) + 1:])
            self.r.remove(i)

        return list(sorted(self.x))

    def sumRe(self, r, k, n, number):
        if k == 1:
            if n in number:
                self.r.append(n)
                self.x.append(self.r)
                self.r = self.r[:-1]

            return

        for i in number:
            self.r.append(i)
            self.sumRe(self.r, k-1, n-i, number[number.index(i) + 1:])
            self.r = self.r[:-1]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值