LeetCode-16. 最接近的三数之和

题目链接

最接近的三数之和

题目描述

在这里插入图片描述

题解

题解一(Go)

作者:@仲景
就是和三数之和差不多思路,官方题解是有去重的,但是我觉得不去并不会影响什么,所以就没有去

func threeSumClosest(nums []int, target int) int {
  /*
    和三数之和差不多吧,排序数组,选定一个目标值,然后双指针遍历其他元素,对双指针进行移动
    因为题目给出假设只有一个解,所以求出每次目标值的能组成最接近target的值之后取最小的一个就可以
  */

  len := len(nums)

  // 给数组排序
  sort.Ints(nums)

  res, min := 0, math.MaxInt32

  for i := 0; i < len-2; i++ {
    for left, right := i+1, len-1; left < right; {
      // 当前3个数加起来的和
      sum := nums[i] + nums[left] + nums[right]

      // 如果当前加起来的和与target的差值小于之前的最小差值,最小差值就应该是当前的和与target的差值
      // res其实是一个跟踪变量,记录的是上一次最小时候sum的值,
      // 这样循环结束之后,如果没有相等的情况,res就可以用来返回
      if abs(sum-target) < min {
        res, min = sum, abs(sum-target)
      }
      if sum > target {
        right--
      } else if sum < target {
        left++
      } else {
        return sum
      }
    }
  }

  return res
}

func abs(a int) int {
  if a < 0 {
    return -a
  }
  return a
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值