-
Notifications
You must be signed in to change notification settings - Fork 28
/
Contents.swift
65 lines (56 loc) · 1.57 KB
/
Contents.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
import Foundation
/*
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
*/
//O(n^2) - time
//O(n) - space
func threeSum(_ nums: [Int]) -> [[Int]] {
var nums = nums.sorted { (a, b) -> Bool in
return a < b
}
guard nums.count > 2 else{
return []
}
var solutions = [[Int]]()
for i in 0..<nums.count - 2{
let f1 = nums[i]
if i > 0 && f1 == nums[i-1]{
continue
}
if f1 > 0 {
break
}
var leftPtr = i + 1,rightPtr = nums.count - 1,sum = 0 - f1
while leftPtr < rightPtr{
let s = nums[leftPtr] + nums[rightPtr]
if s == sum{
solutions.append([f1,nums[leftPtr],nums[rightPtr]])
while leftPtr < rightPtr && nums[leftPtr] == nums[leftPtr + 1]{
leftPtr += 1
}
while leftPtr < rightPtr && nums[rightPtr] == nums[rightPtr - 1]{
rightPtr -= 1
}
leftPtr += 1
rightPtr -= 1
}else{
if s < sum{
leftPtr += 1
}else{
rightPtr -= 1
}
}
}
}
return solutions
}
threeSum([-13,5,13,12,-2,-11,-1,12,-3,0,-3,-7])