16.最接近三数之和(leetcode)

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

开心,这题用15题的方法一遍过。

相同点:

  1. 排除 len(nums) < 3 的情况

  2. 先排序

  3. 三指针,两个循环

  4. 同样的句子来List去重 while i<j and nums[i] == nums[i-1]: i+=1

 

不同点:

  1. k 这层循环要走完 |   而不是走到nums[k] > 0就停止了

  2. 存储答案的是一个List,存储  [差值,答案]  |  而不是之前的List Of Lists

  3. 迭代的时候不是与0比较,而是与target比较

收获:

  温习了双指针,与去重循环 while i<j and nums[i] == nums[i-1]: i+=1

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        if len(nums)<3:
            return None
        nums.sort()
        resAndGap = [0,float('inf')]
        k = 0
        while k < len(nums):
            i,j = k+1,len(nums) -1
            while i<j:
                s = nums[k] + nums[i] + nums[j]
                resAndGap = [s,abs(s-target)] if  abs(s-target) < resAndGap[1] else  resAndGap
                if s == target:
                    return target
                elif s < target:
                    i += 1
                    while i<j and nums[i] == nums[i-1] : i += 1
                elif s > target:
                    j-= 1
                    while i < j and nums[j] == nums[j+1]: j-=1
            k += 1
            while k < len(nums) and nums[k] == nums[k-1]: k += 1 
        return resAndGap[0]

猜你喜欢

转载自www.cnblogs.com/ChevisZhang/p/12242640.html
今日推荐