题目:
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(); } } };
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)); } } }
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]