From 9a577c7b25ee0ca7e28e6055dffbb6ab815d7743 Mon Sep 17 00:00:00 2001 From: bqlin Date: Sun, 12 Dec 2021 10:28:21 +0800 Subject: [PATCH] =?UTF-8?q?0040.=E7=BB=84=E5=90=88=E6=80=BB=E5=92=8CII?= =?UTF-8?q?=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C=E8=A1=A5?= =?UTF-8?q?=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0040.组合总和II.md | 36 +++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/problems/0040.组合总和II.md b/problems/0040.组合总和II.md index b5e511e7..ac1970e1 100644 --- a/problems/0040.组合总和II.md +++ b/problems/0040.组合总和II.md @@ -381,7 +381,7 @@ class Solution: sum_ -= candidates[i] # 回溯,为了下一轮for loop ``` -## Go: +## Go 主要在于如何在回溯中去重 ```go @@ -424,7 +424,7 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int, } ``` -## javaScript: +## javaScript ```js /** @@ -550,5 +550,37 @@ int** combinationSum2(int* candidates, int candidatesSize, int target, int* retu } ``` +## Swift + +```swift +func combinationSum2(_ candidates: [Int], _ target: Int) -> [[Int]] { + // 为了方便去重复,先对集合排序 + let candidates = candidates.sorted() + var result = [[Int]]() + var path = [Int]() + func backtracking(sum: Int, startIndex: Int) { + // 终止条件 + if sum == target { + result.append(path) + return + } + + let end = candidates.count + guard startIndex < end else { return } + for i in startIndex ..< end { + if i > startIndex, candidates[i] == candidates[i - 1] { continue } // 去重复 + let sum = sum + candidates[i] // 使用局部变量隐藏回溯 + if sum > target { continue } // 剪枝 + + path.append(candidates[i]) // 处理 + backtracking(sum: sum, startIndex: i + 1) // i+1避免重复访问 + path.removeLast() // 回溯 + } + } + backtracking(sum: 0, startIndex: 0) + return result +} +``` + -----------------------