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