18. 四数之和
func fourSum(nums []int, target int) [][]int {
if len(nums) < 4 {
return nil
} //这里提前做一个小判断
sort.Ints(nums)
res := [][]int{}
for i := 0; i < len(nums)-3; i++ {
// 去重a,这个就应该在第二个for循环外,如果在第二个for循环里就白白多运行了几次
n1 := nums[i]
if i > 0 && n1 == nums[i-1] {
continue
}
for j := i + 1; j < len(nums)-2; j++ {
n2 := nums[j]
//去重b
if j > i+1 && n2 == nums[j-1] {
continue
}
l, r := j+1, len(nums)-1
for l < r {
n3, n4 := nums[l], nums[r]
if n1+n2+n3+n4 == target {
res = append(res, []int{n1, n2, n3, n4})
// 去重逻辑应该放在找到一个四元组之后,对c 和 d去重
for l < r && nums[l] == n3 {
l++
}
for l < r && nums[r] == n4 {
r--
}
// 找到答案时,双指针同时靠近
//r--
//l++
} else if n1+n2+n3+n4 < target {
l++
} else {
r--
}
}
}
}
return res
}
思路和15.三数之和一样
但题目中有几处细节需要注意
1.
// 去重a,这个就应该在第二个for循环外,如果在第二个for循环里就白白多运行了几次
n1 := nums[i]
if i > 0 && n1 == nums[i-1] {
continue
}
2.
// 去重逻辑应该放在找到一个四元组之后,对c 和 d去重
for l < r && nums[l] == n3 {
l++
}
for l < r && nums[r] == n4 {
r--
}
这里如果用
nums[l+1]
,nums[r-1]
作比较时,需加上
// 去重逻辑应该放在找到一个四元组之后,对c 和 d去重
for l < r && nums[l+1] == n3 {
l++
}
for l < r && nums[r-1] == n4 {
r--
}
// 找到答案时,双指针同时靠近
r--
l++
这一点需格外注意,这属于编程时的细节之处,找bug时不好找啊