16. 最接近的三数之和
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。
示例 1:
输入:nums = [-1,2,1,-4], target = 1 输出:2 解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2)。
分析: 本题采用暴力解法时间复杂度O(N^3),可以通过O(log2N)的排序算法来降低复杂度,遍历一遍第一个数到第N-2个数字,通过双指针不断比较nums[i]和左右指针之和比target大还是小,不断移动左右指针直至相遇。
代码:
sort.Ints(nums)
if len(nums) == 3 {
return nums[0]+nums[1]+nums[2]
}
var closest int = nums[0] + nums[1] + nums[2]
for i := 0; i < (len(nums)-2); i++ {
// if i>0 && nums[i] == nums[i-1] {
// continue
// }
var pc int = len(nums) -1
var pb int = i+1
for pc > pb {
if nums[pb] + nums[pc] + nums[i] == target {
return target
}
if abs(nums[pb] + nums[pc] + nums[i]- target) < abs(closest - target) {
closest = nums[pb] + nums[pc] + nums[i]
}
if (nums[pb] + nums[pc] + nums[i]) < target {
pb++
} else if (nums[pb] + nums[pc] + nums[i] > target) {
pc--
}
}
}
return closest
}
func abs(n int) int {
if n > 0 {
return n
}
return -n
}