فهرست منبع

add 'fourSum'

tangs 5 سال پیش
والد
کامیت
9038a4b3eb
1فایلهای تغییر یافته به همراه72 افزوده شده و 0 حذف شده
  1. 72 0
      tags/array/fourSum/main.go

+ 72 - 0
tags/array/fourSum/main.go

@@ -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
+}