LeetCode16.最接近的三数之和
1. 问题描述
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
2. 思路
双指针法。
算法流程:
- 特判:对于数组长度n,如果小于3,返回0
- 对数组进行排序
- 遍历排序后的数组
- 令左指针
l
=
i
−
1
l = i - 1
l=i−1,右指针
r
=
n
−
1
r = n - 1
r=n−1,当
l
<
r
l < r
l<r 执行循环
- 令 s u m = n u m s [ i ] + n u m s [ l ] + n u m s [ r ] sum = nums[i] + nums[l] + nums[r] sum=nums[i]+nums[l]+nums[r],如果 s u m − t a r g e t < d i f f ( 上 一 次 的 差 ) sum - target < diff(上一次的差) sum−target<diff(上一次的差),更新res 和 diff
- 当 s u m = = t a r g e t sum == target sum==target,返回res
- 如果sum < target, l l l右移
- 如果 s u m > t a r g e t sum > target sum>target, r r r左移
- 令左指针
l
=
i
−
1
l = i - 1
l=i−1,右指针
r
=
n
−
1
r = n - 1
r=n−1,当
l
<
r
l < r
l<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
}