Skip to content

Commit 8d23e61

Browse files
author
Yeqi Tao
committed
Add Soulution.go for 0018.4Sum
1 parent 8d72c7f commit 8d23e61

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

solution/0018.4Sum/Solution.go

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import "strconv"
2+
3+
type Entry struct {
4+
a1, a2, a3, a4 int
5+
}
6+
7+
func(e *Entry) String() string {
8+
return strconv.FormatInt(int64(e.a1), 10) +
9+
"," + strconv.FormatInt(int64(e.a2), 10) +
10+
"," + strconv.FormatInt(int64(e.a3), 10) +
11+
"," + strconv.FormatInt(int64(e.a4), 10)
12+
}
13+
14+
func fourSum(nums []int, target int) [][]int {
15+
flag := make(map[string]bool)
16+
sort(nums)
17+
result := make([][]int, 0)
18+
begin := 0
19+
lenNums := len(nums) - 1
20+
for begin + 2 < lenNums {
21+
left := begin + 1
22+
right := lenNums
23+
lt := target - nums[begin]
24+
for left + 1 < right {
25+
i := left + 1
26+
j := right
27+
subTarget := lt - nums[left]
28+
for i < j {
29+
if nums[i] + nums[j] > subTarget {
30+
j--
31+
} else if nums[i] + nums[j] < subTarget {
32+
i++
33+
} else {
34+
entry := &Entry{
35+
a1:nums[begin],
36+
a2:nums[left],
37+
a3:nums[i],
38+
a4:nums[j],
39+
}
40+
if !flag[entry.String()] {
41+
r := []int{nums[begin], nums[left], nums[i], nums[j]}
42+
result = append(result, r)
43+
flag[entry.String()] = true
44+
}
45+
i++
46+
j--
47+
}
48+
}
49+
left++
50+
}
51+
begin++
52+
}
53+
return result
54+
}
55+
56+
// quick sort
57+
func sort(array []int) {
58+
if len(array) == 0 {
59+
return
60+
}
61+
left := 0
62+
right := len(array) - 1
63+
obj := array[left]
64+
for left < right {
65+
for left < right && array[right] >= obj {
66+
right--
67+
}
68+
array[left] = array[right]
69+
70+
for left < right && array[left] <= obj {
71+
left++
72+
}
73+
array[right] = array[left]
74+
}
75+
array[left] = obj
76+
sort(array[:left])
77+
sort(array[right+1:])
78+
}

0 commit comments

Comments
 (0)