【leetcode】(python) 16. 3Sum Closest详解

Description

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).

题目大意

在一个整数数组中,给定一个目标数,使其中三个整数之和最接近该目标数

解体思路

利用twoSum的方法,two pointers 来辅助,每次确定第一个数字,剩下的就是找两个数字之和的问题了。用two pointers 来遍历找两数之和,先sort,只有在从小到大排序之后的结果上,才能根据情况移动left 和right。若遍历三数之和sum小于目标值,说明要使其中某数变大,因为right已经最大,所以只得left右移+1才能变大。同理,若遍历三数之和sum大于目标值,则right减1。若sum等于target,则完美契合,刚好找到符合要求的结果,直接return sum即可。

代码

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        mindiff = 10000
        res = 0
        nums.sort()
        for i in range(len(nums)):
            left = i + 1
            right = len(nums) - 1
            while left < right:
                sum = nums[left] + nums[i] + nums[right]
                diff = abs(sum - target)
                if diff < mindiff:
                    mindiff = diff
                    res = sum
                elif target  == sum:
                    return sum
                elif sum < target:
                    left += 1
                else:
                    right -= 1
        return res

Runtime:116 ms,Memory:13.1 MB

参考较优解

解题思路

同样是对数组排序,再用双指针左右调整数值,原来思路每次都从最left和最right开始逐一判断,所用时较长。那如果三数之和大于target,说明right太大了,不用从最right一步步往左边小数移动,直接尝试left再后面的left+1位置的数,想来比right位置值较为合适。同理,如果三数之和小于target,说明left太小了,直接尝试right再前面的right-1位置的数,这样先作判断,求得合乎要求的时间大大减少。

代码

class Solution:
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        result = list()
        nums.sort()
        for i,num in enumerate(nums[0:-2]):
            l, r = i + 1, len(nums) - 1
            if nums[l] + nums[l + 1] + num > target:
                result.append(nums[l] + nums[l + 1] + num)
            elif nums[r] + nums[r - 1] + num < target:
                result.append(nums[r] + nums[r - 1] + num)
            else:
                while l < r:
                    result.append(nums[l] + nums[r] + num)
                    if nums[l] + nums[r] + num < target:
                        l += 1
                    elif nums[l] + nums[r] + num > target:
                        r -= 1
                    else:
                        return target
        result.sort(key=lambda x:abs(x-target))
        return result[0]

Runtime:44 ms

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值