LeetCode16.最接近的三数之和
1. 问题描述
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
2. 思路
双指针法。
算法流程:
- 特判:对于数组长度n,如果小于3,返回0
- 对数组进行排序
- 遍历排序后的数组
- 令左指针l=i−1l = i - 1l=i−1,右指针r=n−1r = n - 1r=n−1,当 l<rl < rl<r 执行循环
- 令sum=nums[i]+nums[l]+nums[r]sum = nums[i] + nums[l] + nums[r]sum=nums[i]+nums[l]+nums[r],如果sum−target<diff(上一次的差)sum - target < diff(上一次的差)sum−target<diff(上一次的差),更新res 和 diff
- 当sum==targetsum == targetsum==target,返回res
- 如果sum < target,lll右移
- 如果sum>targetsum > targetsum>target,rrr左移
- 令左指针l=i−1l = i - 1l=i−1,右指针r=n−1r = n - 1r=n−1,当 l<rl < rl<r 执行循环
3. 代码
func threeSumClosest(nums []int, target int) int {
var res int
if len(nums) < 3 {
return res
}
sort.Ints(nums)
length := len(nums)
diff := math.MaxInt32
for i := 0; i < length; i++ {
l, r := i + 1, length - 1
for l < r {
sum := nums[i] + nums[l] + nums[r]
// 不停更新res(最小的sum)和diff(最小的差值)
if abs(sum - target) < diff {
res, diff = sum, abs(sum - target)
}
if sum == target {
return res
} else if sum < target {
l++
} else {
r--
}
}
}
return res
}
func abs(a int) int {
if a < 0 {
a = -a
}
return a
}