-
Notifications
You must be signed in to change notification settings - Fork 20
/
ThreeSum.go
80 lines (68 loc) · 1.39 KB
/
ThreeSum.go
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
69
70
71
72
73
74
75
76
77
78
79
80
package ThreeSum
//Given an array S of n integers, are there elements a, b, c in S 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.
//
//For example, given array S = [-1, 0, 1, 2, -1, -4],
//
//A solution set is:
//[
//[-1, 0, 1],
//[-1, -1, 2]
//]
//
//Accepted.
import (
"sort"
)
func threeSum(nums []int) [][]int {
sort.Ints(nums)
set := make(map[[3]int]*Triple)
for first := 0; first < len(nums)-2; first++ {
if nums[first] > 0 {
break
}
target := 0 - nums[first]
second := first + 1
third := len(nums) - 1
for ; second < third; {
if nums[second]+nums[third] == target {
key := [3]int{nums[first], nums[second], nums[third]}
if _, ok := set[key]; !ok {
set[key] = &Triple{
a: nums[first],
b: nums[second],
c: nums[third],
}
}
for ; second < third && nums[second] == nums[second+1]; {
second++
}
for ; second < third && nums[third] == nums[third-1]; {
third--
}
second++
third--
} else if nums[second]+nums[third] < target {
second++
} else {
third--
}
}
}
lists := make([][]int, 0)
for _, v := range set {
l := make([]int, 0)
l = append(l, v.a)
l = append(l, v.b)
l = append(l, v.c)
lists = append(lists, l)
}
return lists
}
type Triple struct {
a int
b int
c int
}