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

目录

  • Description
  • example
  • 题目大意
  • 解体思路
  • 代码
  • 参考较优解
    • 解题思路
    • 代码

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

你可能感兴趣的:(LeetCode)