力扣第16题“最接近的三数之和”(python解决)

题目:

思路:

这一题与上一题类似,上一题我没有做出来,看了题解中大神的做法,先对原序列进行排序,然后利用当前指针向右遍历,当前指针右侧的左(当前指针+1)右(len(nums)-1)双指针遍历当前指针右侧的所有值,当三数之和大于0,证明当前右指针的值太大,right =right-1,反之,left = left-1,这题我也采用了类似的思路。

代码:

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        length =  len(nums)
        if length ==3:
            return nums[0]+nums[1]+nums[2]#如果nums长为3,直接返回三数之和
        nums.sort() #将nums变成有序数组
        templist = [] 
        nowpoint,temp = 0,0
        while nowpoint <=(length-3): #nowpoiont从左向右遍历
            left = nowpoint+1        
            right = length-1
            if nowpoint==0: #使得templist中有初值
                temp = nums[nowpoint]+nums[left]+nums[right]-target
                templist.append(temp) #用abs(temp)衡量三数之和与target的差值
            while left <right:
                sum_num = nums[nowpoint]+nums[left]+nums[right]
                temp=sum_num-target

                if abs(temp) <= abs(templist[0]): #用abs(temp)衡量三数之和与target的差值
                    templist.clear()
                    templist.append(temp)
                
                if temp == 0:
                    return sum_num
                elif temp>0: #如果差值大于0,说明nums[right]太大,right往左移动一位
                    right -=1
                else:       #如果差值小于0,说明nums[left]太小,left往右移动一位
                    left +=1
            nowpoint +=1
        return templist[0]+target

大神代码:

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums.sort()
        n = len(nums)
        res = nums[0] + nums[1] + nums[2]
        for i in range(n):
            left, right = i+1, n-1
            while left < right:
                sum = nums[i] + nums[left] + nums[right]
                if abs(target-sum) < abs(target-res):
                    res = sum
                if sum > target:
                    right -= 1
                elif sum < target:
                    left += 1
                else:
                    return res
        return res

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值