LeetCode16. 最接近的三数之和

Posted Dream丶Killer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode16. 最接近的三数之和相关的知识,希望对你有一定的参考价值。

题目来源:力扣(LeetCode)


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


示例1:

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

提示:

  • 3 <= nums.length <= 10^3
  • -10^3 <= nums[i] <= 10^3
  • -10^4 <= target <= 10^4

解题思路:
这题与上题类似,如果上题搞懂了,这题应该也不难,只是改变一下判断条件。
LeetCode15. 三数之和
简单说一下思路,首先对 nums 数组进行排序,然后遍历排序后的 nums,要注意跳过重复的组合,然后定义两个指针 leftright ,当 left < right 时,执行循环,计算 nums[i] + nums[left] + nums[right] 的值,判断该值是否更接近 target ,如果是则替换 similar_num ,然后根据 addtarget 的大小移动指定指针。

class Solution(object):
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        length = len(nums)
        # 赋初值
        similar_num = sum(nums[:3])
        # 对nums进行排序
        nums.sort()
        # 遍历排序后的nums
        for i in range(length - 2):
            # 跳过重复的组合
            if i > 0 and nums[i] == nums[i - 1]:
                continue
            left = i + 1
            right = length - 1
            while left < right:
                add = nums[i] + nums[left] + nums[right]
                # 当前的值更接近target,需要替换
                if abs(add - target) < abs(similar_num - target):
                    similar_num = add
                # 如果三数之和add小于目标值target,则left右移(值增大)
                if add < target:
                    left += 1
                # 如果三数之和add大于目标值target,则right右移(值减小)
                elif add > target:
                    right -= 1
                # add等于target,即已找到最相近的三个数,直接返回
                else:
                    return similar_num
        return similar_num

在这里插入图片描述

以上是关于LeetCode16. 最接近的三数之和的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-----16. 最接近的三数之和

LeetCode 16. 最接近的三数之和

LeetCode:最接近的三数之和16

leetcode 16:最接近的三数之和

LeetCode 16最接近的三数之和

leetcode 每日一题 16. 最接近的三数之和