Loading

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

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

示例:

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

提示:

  • 3 <= nums.length <= 103
  • -103 <= nums[i] <= 103
  • -104 <= target <= 104

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

def threeSumClosest(nums: list, target: int) -> int:
    # 简单情况处理
    # 题约束了nums.length>=3
    len=nums.__len__()
    if len==3: return sum(nums)

    # 这题不能用dict,它是找最接近而不是找确定的值,left计算出来,dict找最接近是很难找的,遍历不方便
    # list排过序后,倒是可以O(n^2*logn),left用二分找最接近的,先看看超不超时
    # 注意,遍历还是会出现排列组合的情况,保持答案[x,y,left]递增

    nums.sort()
    x=y=0
    left=0
    res=nums[0]+nums[1]+nums[2]
    while x<len:
        y=x+1
        while y<len:
            left=target-(nums[x]+nums[y])
            # [y+1,len)中找最接近left的
            l=y+1;r=len-1;mid=int((l+r)/2)
            while l<=r:
                if l==r:
                    res=nums[x]+nums[y]+nums[mid] if abs(nums[x]+nums[y]+nums[mid]-target)<abs(res-target) else res
                    break
                # [l,mid]
                v_lmid=nums[int((l+mid)/2)]
                abs_l=abs(v_lmid - left)
                ### 错误 - 1
                ## [mid+1,r]
                #v_rmid=nums[int((mid+1+r)/2)]
                # [mid,r]
                v_rmid=nums[int((mid+r)/2)]
                ### 错误 - 1
                abs_r=abs(v_rmid - left)
                if abs_l<=abs_r:
                    r=mid;mid=int((l+r)/2)
                else:
                    ### 错误 - 1
                    # l=mid+1;mid=int((l+r)/2)
                    l=mid;mid=int((l+r)/2)
                    ### 错误 - 1
            y+=1
        x+=1
    return res

奇怪,debug中,对不上行,且运行逻辑混乱,这是pycharm的bug吗?

posted @ 2021-08-29 10:04  wwcg2235  阅读(33)  评论(0)    收藏  举报