|
@@ -0,0 +1,72 @@
|
|
|
|
+package main
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "fmt"
|
|
|
|
+ "sort"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+func main() {
|
|
|
|
+ var nums []int
|
|
|
|
+ var target int
|
|
|
|
+
|
|
|
|
+ nums = []int{0, 0, 0, 0}
|
|
|
|
+ target = 0
|
|
|
|
+ fmt.Println(fourSum(nums, target))
|
|
|
|
+
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ nums = []int{1, 0, -1, 0, -2, 2}
|
|
|
|
+ target = 0
|
|
|
|
+ fmt.Println(fourSum(nums, target))
|
|
|
|
+
|
|
|
|
+ nums = []int{-3, -2, -1, 0, 0, 1, 2, 3}
|
|
|
|
+ target = 0
|
|
|
|
+ fmt.Println(fourSum(nums, target))
|
|
|
|
+
|
|
|
|
+ nums = []int{-3, 0, 0, 1, 2}
|
|
|
|
+ target = 0
|
|
|
|
+ fmt.Println(fourSum(nums, target))
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func fourSum(nums []int, target int) [][]int {
|
|
|
|
+ sort.Ints(nums)
|
|
|
|
+ var ret [][]int
|
|
|
|
+ for i := 0; i < len(nums)-2; i++ {
|
|
|
|
+ if i > 0 && nums[i] == nums[i-1] {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ for j := i + 1; j < len(nums)-1; j++ {
|
|
|
|
+ if j > i+1 && nums[j] == nums[j-1] {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ var front, back = j + 1, len(nums) - 1
|
|
|
|
+ var sum = 0
|
|
|
|
+ for front < back {
|
|
|
|
+ sum = nums[i] + nums[j] + nums[front] + nums[back] - target
|
|
|
|
+ //fmt.Println(nums[i], nums[j], nums[front], nums[back], sum)
|
|
|
|
+ if sum == 0 {
|
|
|
|
+ ret = append(ret, []int{nums[i], nums[j], nums[front], nums[back]})
|
|
|
|
+ for front < back {
|
|
|
|
+ front++
|
|
|
|
+ if nums[front] != nums[front-1] {
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for front < back {
|
|
|
|
+ back--
|
|
|
|
+ if nums[back] != nums[back+1] {
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if sum > 0 {
|
|
|
|
+ back--
|
|
|
|
+ }
|
|
|
|
+ if sum < 0 {
|
|
|
|
+ front++
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return ret
|
|
|
|
+}
|