Skip to content

Commit 90be8cb

Browse files
committed
feat: add solutions to lc problem: No.0216
No.0216.Combination Sum III
1 parent f9004a2 commit 90be8cb

File tree

8 files changed

+955
-192
lines changed

8 files changed

+955
-192
lines changed

solution/0200-0299/0216.Combination Sum III/README.md

+445-46
Large diffs are not rendered by default.

solution/0200-0299/0216.Combination Sum III/README_EN.md

+416-45
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
class Solution {
22
public:
3-
vector<vector<int>> ans;
4-
53
vector<vector<int>> combinationSum3(int k, int n) {
4+
vector<vector<int>> ans;
65
vector<int> t;
7-
dfs(0, n, k, t);
6+
function<void(int, int)> dfs = [&](int i, int s) {
7+
if (s == 0) {
8+
if (t.size() == k) {
9+
ans.emplace_back(t);
10+
}
11+
return;
12+
}
13+
if (i > 9 || i > s || t.size() >= k) {
14+
return;
15+
}
16+
t.emplace_back(i);
17+
dfs(i + 1, s - i);
18+
t.pop_back();
19+
dfs(i + 1, s);
20+
};
21+
dfs(1, n);
822
return ans;
923
}
10-
11-
void dfs(int i, int n, int k, vector<int>& t) {
12-
if (i > 9 || n < 0 || t.size() > k) return;
13-
if (n == 0 && t.size() == k) {
14-
ans.push_back(t);
15-
return;
16-
}
17-
++i;
18-
t.push_back(i);
19-
dfs(i, n - i, k, t);
20-
t.pop_back();
21-
dfs(i, n, k, t);
22-
}
2324
};
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,27 @@
1-
using System.Collections.Generic;
1+
public class Solution {
2+
private List<IList<int>> ans = new List<IList<int>>();
3+
private List<int> t = new List<int>();
4+
private int k;
25

3-
public class Solution
4-
{
5-
public IList<IList<int>> CombinationSum3(int k, int n)
6-
{
7-
if (n == 0 || k == 0) return new IList<int>[0];
8-
9-
var paths = new List<int>[n + 1, k + 1];
10-
paths[0, 0] = new List<int>();
11-
for (var c = 1; c <= 9; ++c)
12-
{
13-
for (var j = n; j >= c; --j)
14-
{
15-
for (var kk = 1; kk <= k; ++kk)
16-
{
17-
if (paths[j - c, kk - 1] != null)
18-
{
19-
if (paths[j, kk] == null)
20-
{
21-
paths[j, kk] = new List<int>();
22-
}
23-
paths[j, kk].Add(c);
24-
}
25-
}
26-
}
27-
}
28-
29-
var results = new List<IList<int>>();
30-
if (paths[n, k] != null && paths[n, k].Count > 0) GenerateResults(results, new Stack<int>(), paths, k, n, paths[n, k].Count - 1);
31-
return results;
6+
public IList<IList<int>> CombinationSum3(int k, int n) {
7+
this.k = k;
8+
dfs(1, n);
9+
return ans;
3210
}
3311

34-
private void GenerateResults(IList<IList<int>> results, Stack<int> result, List<int>[,] paths, int k, int n,
35-
int maxIndex)
36-
{
37-
if (n == 0)
38-
{
39-
results.Add(new List<int>(result));
12+
private void dfs(int i, int s) {
13+
if (s == 0) {
14+
if (t.Count == k) {
15+
ans.Add(new List<int>(t));
16+
}
4017
return;
4118
}
42-
for (var i = maxIndex; i >= 0; --i)
43-
{
44-
var value = paths[n, k][i];
45-
result.Push(value);
46-
var nextMaxIndex = paths[n - value, k - 1].BinarySearch(value);
47-
if (nextMaxIndex >= 0)
48-
{
49-
--nextMaxIndex;
50-
}
51-
else if (nextMaxIndex < 0)
52-
{
53-
nextMaxIndex = ~nextMaxIndex - 1;
54-
}
55-
GenerateResults(results, result, paths, k - 1, n - value, nextMaxIndex);
56-
result.Pop();
19+
if (i > 9 || i > s || t.Count >= k) {
20+
return;
5721
}
22+
t.Add(i);
23+
dfs(i + 1, s - i);
24+
t.RemoveAt(t.Count - 1);
25+
dfs(i + 1, s);
5826
}
5927
}
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,23 @@
1-
func combinationSum3(k int, n int) [][]int {
2-
var ans [][]int
3-
var t []int
4-
var dfs func(i, n int, t []int)
5-
dfs = func(i, n int, t []int) {
6-
if i > 9 || n < 0 || len(t) > k {
1+
func combinationSum3(k int, n int) (ans [][]int) {
2+
t := []int{}
3+
var dfs func(i, s int)
4+
dfs = func(i, s int) {
5+
if s == 0 {
6+
if len(t) == k {
7+
cp := make([]int, len(t))
8+
copy(cp, t)
9+
ans = append(ans, cp)
10+
}
711
return
812
}
9-
if n == 0 && len(t) == k {
10-
cp := make([]int, len(t))
11-
copy(cp, t)
12-
ans = append(ans, cp)
13+
if i > 9 || i > s || len(t) >= k {
1314
return
1415
}
15-
i++
1616
t = append(t, i)
17-
dfs(i, n-i, t)
17+
dfs(i+1, s-i)
1818
t = t[:len(t)-1]
19-
dfs(i, n, t)
19+
dfs(i+1, s)
2020
}
21-
22-
dfs(0, n, t)
23-
return ans
21+
dfs(1, n)
22+
return
2423
}
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
class Solution {
2-
private List<List<Integer>> ans;
2+
private List<List<Integer>> ans = new ArrayList<>();
3+
private List<Integer> t = new ArrayList<>();
4+
private int k;
35

46
public List<List<Integer>> combinationSum3(int k, int n) {
5-
ans = new ArrayList<>();
6-
dfs(0, n, k, new ArrayList<>());
7+
this.k = k;
8+
dfs(1, n);
79
return ans;
810
}
911

10-
private void dfs(int i, int n, int k, List<Integer> t) {
11-
if (i > 9 || n < 0 || t.size() > k) {
12+
private void dfs(int i, int s) {
13+
if (s == 0) {
14+
if (t.size() == k) {
15+
ans.add(new ArrayList<>(t));
16+
}
1217
return;
1318
}
14-
if (n == 0 && t.size() == k) {
15-
ans.add(new ArrayList<>(t));
19+
if (i > 9 || i > s || t.size() >= k) {
1620
return;
1721
}
18-
++i;
1922
t.add(i);
20-
dfs(i, n - i, k, t);
23+
dfs(i + 1, s - i);
2124
t.remove(t.size() - 1);
22-
dfs(i, n, k, t);
25+
dfs(i + 1, s);
2326
}
2427
}
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
class Solution:
22
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
3-
def dfs(i, s, t):
4-
if i > 9 or s > n or len(t) > k:
3+
def dfs(i: int, s: int):
4+
if s == 0:
5+
if len(t) == k:
6+
ans.append(t[:])
57
return
6-
if s == n and len(t) == k:
7-
ans.append(t[:])
8+
if i > 9 or i > s or len(t) >= k:
89
return
9-
i += 1
1010
t.append(i)
11-
dfs(i, s + i, t)
11+
dfs(i + 1, s - i)
1212
t.pop()
13-
dfs(i, s, t)
13+
dfs(i + 1, s)
1414

1515
ans = []
16-
dfs(0, 0, [])
16+
t = []
17+
dfs(1, n)
1718
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
function combinationSum3(k: number, n: number): number[][] {
2+
const ans: number[][] = [];
3+
const t: number[] = [];
4+
const dfs = (i: number, s: number) => {
5+
if (s === 0) {
6+
if (t.length === k) {
7+
ans.push(t.slice());
8+
}
9+
return;
10+
}
11+
if (i > 9 || i > s || t.length > k) {
12+
return;
13+
}
14+
t.push(i);
15+
dfs(i + 1, s - i);
16+
t.pop();
17+
dfs(i + 1, s);
18+
};
19+
dfs(1, n);
20+
return ans;
21+
}

0 commit comments

Comments
 (0)