|
6 | 6 | */
|
7 | 7 |
|
8 | 8 | class ThreeSum {
|
9 |
| - func threeSum(nums: [Int]) -> [[Int]] { |
10 |
| - var nums = nums.sorted(by: <) |
| 9 | + func threeSum(_ nums: [Int]) -> [[Int]] { |
11 | 10 | var res = [[Int]]()
|
12 | 11 |
|
13 |
| - if nums.count <= 2 { |
| 12 | + guard nums.count >= 3 else { |
14 | 13 | return res
|
15 | 14 | }
|
16 | 15 |
|
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 |
45 | 41 | }
|
46 | 42 | }
|
47 | 43 | }
|
|
0 commit comments