申明:本文只用做自己学习记录
题目
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:答案中不可以包含重复的四元组。
示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
示例 2:
输入:nums = [], target = 0
输出:[]
代码
func fourSum(nums []int, target int) [][]int {
//冒泡法排序
for i := 0; i < len(nums); i++ {
for j := 0; j < len(nums)-1-i; j++ {
if nums[j] > nums[j+1] {
nums[j], nums[j+1] = nums[j+1], nums[j]
}
}
}
results := [][]int{}
//开始循环,当前四位数相加<target时,说明后面可以继续循环,否则循环没有意义
for i := 0; i < len(nums)-3 && nums[i]+nums[i+1]+nums[i+2]+nums[i+3] <= target; i++ {
//跳过重复值,后面最大值<target时,跳过本次循环
if i > 0 && nums[i] == nums[i-1] || nums[i]+nums[len(nums)-3]+nums[len(nums)-2]+nums[len(nums)-1] < target {
continue
}
for j := i + 1; j < len(nums)-2; j++ {
//跳过重复值,后面最大值<target时,跳过本次循环
if j > i+1 && nums[j] == nums[j-1] || nums[i]+nums[j]+nums[len(nums)-2]+nums[len(nums)-1] < target {
continue
}
//
for left, right := j+1, len(nums)-1; left < right; {
if nums[i]+nums[j]+nums[left]+nums[right] == target {
results = append(results, []int{nums[i], nums[j], nums[left], nums[right]})
//跳过重复值
for left < right && nums[left] == nums[left+1] {
left++
}
//跳过重复值
for left < right && nums[right] == nums[right-1] {
right--
}
left++
right--
} else if nums[i]+nums[j]+nums[left]+nums[right] < target {
left++
} else {
right--
}
}
}
}
return results
}