题目16:最接近的三数之和
题目描述:
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
题解:
1.最直接的办法,三重遍历,求出差值的绝对值最小的数。
func threeSumClosest(nums []int, target int) int {
sort.Ints(nums)
res := 0
diff := math.MaxInt
for i:=0;i<len(nums)-2;i++{
for j:=i+1;j<len(nums)-1;j++{
for k:=j+1;k<len(nums);k++{
if abs(nums[i]+nums[j]+nums[k] - target) < diff{
res = nums[i]+nums[j]+nums[k]
diff = abs(nums[i]+nums[j]+nums[k] - target)
}
}
}
}
return res
}
func abs(n int) int{
if n <0{
n = -1*n
}
return n
}
2.用和15题类似的双指针
func threeSumClosest(nums []int, target int) int {
res, diff := 0, math.MaxInt
sort.Ints(nums)
for i:= 0; i<len(nums)-2;i++{
left := i+1
right:=len(nums)-1
for left <right{
sum := nums[i]+nums[left]+nums[right]
if abs(sum-target) < diff{
res = sum
diff = abs(sum-target)
}
if sum >target{
right--
}else if sum < target{
left++
}else{
return sum
}
}
}
return res
}
func abs(n int) int{
if n<0{
n= -1*n
}
return n
}