题目链接:LeetCode16
相似题:LeetCode15
属于思路没难点,适合入门同学仔细品味的好题目。
题意
给定一个数组,和一个target,要求从数组当中取三个数,使得他们的和最接近target
思路一:暴力
因为给定的数组最多只有1k个元素,三重循环暴力只需要执行10^9次,勉强卡过时间限制。
代码(Golang)
func threeSumClosest(nums []int, target int) int {
var ans,mi int
mi=math.MaxInt64
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++{
tmp:=nums[i]+nums[j]+nums[k]
if(abs(tmp-target)<mi){
mi=abs(tmp-target)
ans=tmp
}
}
}
}
return ans
}
func abs(a int) int{
if(a<0){
return -a
}
return a
}
思路二:排序+双指针
先将数组进行排序,然后假设:a≤b≤c,是我们要最后取的三个数的下标。
- 枚举a,对于b和c,令b=a+1,c=len(nums)-1
- 对每一组 tmp=nums[a]+nums[b]+nums[c],先更新答案。
- 若tmp>target,则c--
- 若tmp<target,则b++
- 若tmp==target,则返回target
代码(Golang)
func threeSumClosest(nums []int, target int) int {
var ans,mi int
mi=math.MaxInt64
sort.Ints(nums)
for i:=0;i<len(nums)-2;i++{
j,k:=i+1,len(nums)-1
for j<k{
tmp:=nums[i]+nums[j]+nums[k]
if(abs(tmp-target)<mi){
mi=abs(tmp-target)
ans=tmp
}
if(tmp>target){
k--
}else if(tmp<target){
j++
}else{
return target
}
}
}
return ans
}
func abs(a int) int{
if(a<0){
return -a
}
return a
}