​最接近的三数之和​

今天每日一练时这道题翻车了,记录一下。

开始我还以为题出错了,没有正确答案,我理解成了,和tartget目标值最接近的三个数的和,结果应该是三个数的和和target最接近。

nums是输入的一个列表,长度大于等于三,target是你输入的目标数字,要求是得出nums中三个元素之和最接近target的值。

from typing import List
class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums.sort() # 给列表正排序
        cur = 0 # 游标初始为索引0
        closest = nums[0] + nums[1] + nums[2] # 初始取前三位默认最接近
        while cur < len(nums) - 2: # 因为是取三位数,游标最大取到总长度-3的位置,因为此判断没有等号,所以最大长度-2
            left = cur + 1  # 游标后一位
            right = len(nums) - 1 # 最后一位元素索引
            while left < right:
                n = nums[cur] + nums[left] + nums[right]
                if abs(target - n) < abs(target - closest):
                    closest = n # 这三个数比初始的更接近目标值的话替换之前的closest
                if n == target: # 这三个数刚好等于目标值的话可以break退出了
                    break
                elif n > target:
                    t = right - 1 # 这三个数大于目标值的话最大的元素索引向左移动一位
                    while (t > left and nums[t] == nums[right]):
                        t -= 1 # 最大的元素索引向左移动直到第一个不等于他且小于他的位置
                    right = t
                else:
                    t = left + 1
                    while (t < right and nums[t] == nums[left]):
                        t += 1 # 最小的元素索引向右移动直到第一个不等于他且大于他的位置
                    left = t
            t = cur + 1
            while (t < len(nums) and nums[t] == nums[cur]):
                t += 1
            cur = t # 游标每次循环向右移动
        return closest
# %%
s = Solution()
print(s.threeSumClosest(nums = [-1,2,1,-4], target = 3))

转自:python 每日一练

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值