4Sum
Description
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
Note: The solution set must not contain duplicate quadruplets.
For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.
A solution set is:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
在给定数组中找出“和为 target 的四个数”的所有解。
需要避免重复的解。
这次的答案适用N个数的和;好理解。
Solution
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
|
func fourSum(nums []int, target int) [][]int {
sort.Ints(nums)
return sum(nums, target, 4)
}
func sum(nums []int, target int, n int) [][]int {
if len(nums) < n || // not enough numbers
sumOfSlice(nums[len(nums)-n:]) < target || // max-sum still smaller than target
sumOfSlice(nums[:n]) > target { // min-sum still bigger than target
// no answer
return [][]int{}
}
res := make([][]int, 0)
for i := 0; i < len(nums); i++{
num := nums[i]
if n == 1 && num == target {
return [][]int{
[]int{num},
}
} else if n > 1 {
// let's suppose num is one of the n numbers
// so the other n-1 numbers' sum is target-num
// then search the rest numbers
for _, r := range sum(nums[i+1:], target-num, n-1) {
res = append(res, append(r, num))
}
// skip the same numbers
for j := i + 1; j < len(nums) && nums[j] == num; j++ {
i++
}
}
}
return res
}
// get sum of slice
func sumOfSlice(nums []int) int {
if len(nums) == 1 {
return nums[0]
}
return nums[0] + sumOfSlice(nums[1:])
}
|
Similar Problem