首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Leetcode打卡 | No.016 最接近的三数之和

写在前边:

欢迎和小詹一起定期刷leetcode,每周一和周五更新一题,每一题都吃透,欢迎一题多解,寻找最优解!这个记录帖哪怕只有一个读者,小詹也会坚持刷下去的!


No.16 最接近的三数之和

题目:

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

代码语言:javascript
复制
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

题目分析:

这一题,基本上数之和都有一大家子了。两数之和;三数之和;最接近的三数之和……相信上一题(三数之和)大家多少还有些印象,没有的自行去复习噢。

上一题我们是首先进行排序,将数组进行从小到大的排序,之后固定一个数,在这个数之和,选择从两端进行向中间的逼近。这里思路如下:

  1. 列表排序,sort()方法
  2. 一层循环,固定一个数(索引记为 i),在这个数之后,记 l 指向第一个数,r 指向最后一个数
  3. 如果nums[i]+nums[l]+nums[l+1]大于目标值,那么在nums[i]固定情况下,其他情况只会更大于目标值,此时直接append进目标列表
  4. 如果nums[i]+nums[r]+nums[r-1]小于目标值,那么在nums[i]固定情况下,其他情况只会更小于目标值,此时直接append进目标列表
  5. 其他情况下,当l在r的左边,即第二个数小于第三个数时,继续向下执行。先将这时append进目标列表,并判断nums[i]+nums[l]+nums[r]三数之和和目标值关系,大于目标值,则r减一(最大数减小);小于目标值则l加一(最小数增加);恰好等于直接返回即可(仅有一个解)
  6. 执行完所有循环,则所有可能的答案都在目标列表中,对列表按照与目标值之差的绝对值排序,返回第一个(即差最小,也即最接近的三数之和)

代码如下:

运行结果如下,beat100%!!!(代码非原创,同样的思路,结果没有这么理想,不得不膜拜一分钟啊)

附打卡知识星球:

往期推荐

Leetcode打卡 | No.015 三数之和

下一篇
举报
领券