Skip to content

Commit 2aba790

Browse files
committed
[Array] Refactor solution to 3Sum
1 parent f0f1885 commit 2aba790

File tree

1 file changed

+27
-31
lines changed

1 file changed

+27
-31
lines changed

Array/ThreeSum.swift

+27-31
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,38 @@
66
*/
77

88
class ThreeSum {
9-
func threeSum(nums: [Int]) -> [[Int]] {
10-
var nums = nums.sorted(by: <)
9+
func threeSum(_ nums: [Int]) -> [[Int]] {
1110
var res = [[Int]]()
1211

13-
if nums.count <= 2 {
12+
guard nums.count >= 3 else {
1413
return res
1514
}
1615

17-
for i in 0...nums.count - 3 {
18-
if i == 0 || nums[i] != nums[i - 1] {
19-
var remain = -nums[i]
20-
var left = i + 1
21-
var right = nums.count - 1
22-
while left < right {
23-
if nums[left] + nums[right] == remain {
24-
var temp = [Int]()
25-
temp.append(nums[i])
26-
temp.append(nums[left])
27-
temp.append(nums[right])
28-
29-
res.append(temp)
30-
repeat {
31-
left += 1
32-
} while (left < right && nums[left] == nums[left - 1])
33-
repeat {
34-
right -= 1
35-
} while (left < right && nums[right] == nums[right + 1])
36-
} else if nums[left] + nums[right] < remain {
37-
repeat {
38-
left += 1
39-
} while (left < right && nums[left] == nums[left - 1])
40-
} else {
41-
repeat {
42-
right -= 1
43-
} while (left < right && nums[right] == nums[right + 1])
44-
}
16+
let nums = nums.sorted()
17+
18+
for i in 0..<nums.count - 2 {
19+
if i > 0 && nums[i] == nums[i - 1] {
20+
continue
21+
}
22+
23+
let firstNum = nums[i], remainingSum = -firstNum
24+
var m = i + 1, n = nums.count - 1
25+
26+
while m < n {
27+
if nums[m] + nums[n] == remainingSum {
28+
res.append([firstNum, nums[m], nums[n]])
29+
30+
repeat {
31+
m += 1
32+
} while nums[m] == nums[m - 1] && m < n
33+
34+
repeat {
35+
n -= 1
36+
} while nums[n] == nums[n + 1] && m < n
37+
} else if nums[m] + nums[n] < remainingSum {
38+
m += 1
39+
} else {
40+
n -= 1
4541
}
4642
}
4743
}

0 commit comments

Comments
 (0)