Leetcode-最接近的三数之和

题目描述

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

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

解法

采用排序 + 双指针的思想。

  • 特别情况判定,如果len(nums) <= 3,直接返回sum(nums)
  • nums进行升排序。
  • 对排序后的数组进行遍历:
        1. 对于重复元素:跳过,优化执行时间
        2. 令左指针 low = i + 1,右指针 high = n - 1,当 L < R时,执行循环:
            (1) 计算 nums[i] + nums[low] + nums[high] 三数和,以及与 target 的当前差 cur_diff
            (2) 如果当前差值cur_diff的绝对值小于最小差值,更新最小差值mindiff,将三个数之和赋予给closesum
            (3) 如果cur_diff == 0,绝对是最接近的三数之和,返回。
            (4) 如果cur_diff < 0low指针向右移动,遇到重复的就跳过
            (5) 如果cur_diff > 0high指针向左移动,遇到重复的就跳过

code如下:

def threeSumClosest(nums, target):
    leng = len(nums)
#     if leng < 3: return None
    if leng <=3: return sum(nums)
    # 排序
    nums.sort()
    k, dur_diff = 0, 0
    mindiff = float('inf')
    closesum = 0
    for k in range(leng):
        if k > 1 and nums[k] == nums[k-1]:
                continue
        low = k+1
        high = leng-1
        while low < high:
            threesum = nums[k] + nums[low] + nums[high]
            dur_diff = threesum - target
            # 如果当前绝对值小于minddiff,更新最下minddiff
            if abs(dur_diff) < mindiff:
                mindiff = abs(dur_diff)
                closesum = threesum
            # 如果相等,直接返回closesum
            if dur_diff == 0:
                closesum = threesum
                return closesum
            elif dur_diff < 0:
                low += 1
                while low<high and nums[low] == nums[low-1]: low += 1
            else:
                high -= 1
                while low< high and nums[high] == nums[high+1]: high-=1

    return closesum

测试:

threeSumClosest([1,2,4,8,16,32,64,128],82)
Out:82

参考:https://leetcode-cn.com/problems/3sum-closest/solution/pai-xu-shuang-zhi-zhen-100-ms-ji-bai-liao-9218-de-/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值