-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path39-combination-sum.swift
68 lines (63 loc) · 2.34 KB
/
39-combination-sum.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//
// 39-combination-sum.swift
//
//
// Created by Lugick Wang on 2021/1/8.
// [2,3,6,7] ---> 7
// 括号里是 target ,边是数组里要减去的值。
// 本题组合没有路径差别,所以为了去重,每次都只考虑后边的。比如2考虑2367,3考虑367。
// 子节点小于0返回,等于0加入到结果中
//
//
// (7)
// / /\ \
// / / \ \
// 2/ 3/ 6\ 7\
// / / \ \
// / / \ \
// (5) (4) (1) (0)
// / / \ \ \ \ \
// / / \ \ 3\6\7 6\7 7
// 2/ /3 6\ \7
// / / \ \
// / / \ \
// (3) (2) (-1) (-2)
// //\\ *
// // \\
// 2/ 3\6\7
// /
// /
// (1)
// / / \ \
// 2/ /3 \6 \7
// / / \ \
// (-1) (-2) (-5) (-6)
import Foundation
class Solution {
func combinationSum(_ candidates: [Int], _ target: Int) -> [[Int]] {
var results = [[Int]]()
let sorted = candidates.sorted()
var temp = [Int]()
backtrack(&results, temp: &temp, candidates: sorted, remain: target, start: 0)
return results
}
// 因为要过滤掉重复的,所以每次都只看 start 这个 原数组 index 以后的组合
func backtrack(_ results:inout [[Int]], temp:inout [Int], candidates:[Int], remain: Int, start:Int) {
print("remain--\(remain), start--\(start)")
if remain < 0 {
return
}
if remain == 0 {
results.append(temp)
return
}
for i in start..<candidates.count {
temp.append(candidates[i])
print(candidates[i])
backtrack(&results, temp: &temp, candidates: candidates, remain: remain-candidates[i], start: i)
print(temp)
temp.removeLast()
print(temp)
}
}
}