【LeetCode每日一题】2020.6.24 16. 最接近的三数之和

16. 最接近的三数之和

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

示例:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

分析:

​ 如果使用暴力法,求取每一种三个数的组合。需要三重循环,时间复杂度达到了(O(n^3))

​ 仔细观察这道题目,如果对nums进行排序。就可以利用 双指针法来优化时间复杂度。

if cur_sum == target:
    return cur_sum
if cur_sum < target:
    left += 1
if cur_sum > target:
    right -= 1

​ 如果我们确定了原数组的排序,我们就可以明确下一步指针移动的方向。

代码(Python):

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        res = float("inf")
        ans = 0
        nums.sort()
        n = len(nums)
        for i in range(n - 2):
            left, right = i + 1, n - 1
            while left < right:
                cur_sum = nums[i] + nums[left] + nums[right]
                cur_res = abs(cur_sum - target)
                # 更新答案
                if cur_res < res:
                    res = cur_res
                    ans = cur_sum
		# 指针的移动放在一次循环的末尾更合适一些
                if cur_sum == target:
                    return cur_sum
                elif cur_sum < target:
                    left += 1
                else:
                    right -= 1
        return ans
原文地址:https://www.cnblogs.com/enmac/p/13186146.html