16. 最接近的三数之和

16. 最接近的三数之和

mid

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

https://markdown-1303167219.cos.ap-shanghai.myqcloud.com/image-20220227161358719.png

排序 + 对撞指针

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
func abs(x int) int {
   if x < 0 {
      return -x
   }
   return x
}

// 排序+双指针
func threeSumClosest(nums []int, target int) int {
   sort.Ints(nums)
   minDiff := math.MaxInt32
   resultSum := math.MaxInt32
   for index := 1; index < len(nums)-1; index++ {
      start, end := 0, len(nums)-1
      for start < index && end > index {
         curSum := nums[start] + nums[index] + nums[end]
         curDiff := curSum - target

         if abs(curDiff) < minDiff {
            minDiff = abs(curDiff)
            resultSum = curSum
         }

         switch {
         case curDiff == 0:
            return resultSum
         case curDiff < 0:
            start++
         default:
            end--
         }
      }
   }
   return resultSum
}