LeetCode算法题之16. 3Sum Closest(medium)【Python3题解】

本文详细解析了LeetCode上的第16题——寻找数组中三数之和与目标值最接近的解决方案。通过升序排列数组并采用双指针技巧,避免了暴力枚举的超时问题,实现了高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

Example:

Given array nums = [-1, 2, 1, -4], and target = 1.

The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

题目大意及解题思路:

  • 因为刷了一些题之后会发现,有些题是有挨在一起的,也就是同一种类型的,基本套路,思路是一致的,只是在某一个条件,问法上,变化了一点
  • 下面见此题兄弟LeetCode算法题之15.3Sum(medium)
  • 思路的话,上面那篇文章里面简单说了,还有动图帮助理解
  • 针对此题,不同之处就是,它给定你一个数组,一个target,让你去寻找三数之和与target最接近的,返回三数之和
  • 之前的是让你找到三数之和等于0的,三个数,那什么叫与target最接近的?本人理解就是做差值,然后取绝对值,能得到最小的数的,那就是最近的
  • 有了上面的想法,那就有了突破口,暴力枚举的话,肯定是可以,直接找出所有的三个数,做差值,返回差值最小的三数之和
  • 但是,提交的结果是Time Limit Exceed
  • 无语
  • 所以还是换种遍历方式,能省时一点即可,那就仿照三数之和的做法,不同之处是,先随机设置一个ans,代表三数之和,便于后续做返回值,还有一个d,随机设置一个差值,后面做判断条件用
  • 还是最外层一次for遍历,内部一个while遍历,具体怎么设置见代码
  • 在套一套本题的要求,提交,success!

少废话,上代码:

class Solution:
    def threeSumClosest(self, nums, target):
        nums.sort()#只要涉及数组的问题,首先升序排列,应该问题不大!!!
        ans = nums[0] + nums[1] + nums[2]#设置一个加和初值
        d = abs((nums[0] + nums[1] + nums[2]) - target)#设置差的初值,因为要作为判断依据

        for i in range(len(nums)-2):#最外层循环
            j = i + 1
            k = len(nums)-1
            while j < k:#内层循环,这样降低时间复杂度,暴力枚举会超时
                sum = nums[i] + nums[j] + nums[k]
                n = abs((nums[i] + nums[j] + nums[k]) - target)
                if sum > target:#说明大了,k需要向左移动
                    if n < d:
                        ans = sum
                        d = n
                    k -= 1
                elif sum < target:#同理
                    if n < d:
                        ans = sum
                        d = n
                    j += 1
                else:#这直接说明等于target,那自然是最近的了
                    return sum

        return ans

运行时间和内存占用:

  • Runtime: 144 ms, faster than 47.54% of Python3 online submissions for 3Sum Closest.
  • Memory Usage: 13.9 MB, less than 5.41% of Python3 online submissions for 3Sum Closest.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值