3Sum Closest

来源:互联网 发布:php初级项目开发案例 编辑:程序博客网 时间:2024/06/15 00:14

leetcode第16题,和3sum题类似,但是思路很不一样,要求在数组中找出三个数,使得三个数的和最接近目标数。

这道题最明显的解法是双指针法,主要思路是,先对数组排序,之后从头开始遍历,遍历过程中使用双指针,一个指向开头,一个指向结尾,三个数加和,求取和目标数的差距,如果差距为正,说明加和过大,应该向小的方向调整,所以end指针应该向左移动,同理,如果差距小于0,start指针向右移动,因为数组已经有序,这样移动肯定可以满足调整的要求。
这其中要关注这样几个问题:

  1. 数组为什么要排序,只有排序之后的数组,才能根据三数之和与目标数差的正负来调整前后指针哪个来移动。
  2. 为什么每次都是从i+1个数后面进行双指针遍历,前面的数怎么办?很明显,如果三数之和的组合出现在了i前面,那一定会被前面的大循环遍历到,因此这种遍历是没有遗漏的。
  3. 更小最小值时一定要判断绝对值。
  4. 移动指针看的是tmp这个值,而不是minNum,为什么?因为minNum记录的是最小差距,而每次移动指针是要根据每次计算和与目标数的差距来调整,也就是根据tmp调整。
  5. 返回的为什么不直接是三数之和?很明显,sum在这里是保留不住的,他一直在更新,因此计算得到的一定是最后一组三数之和,那不是正确答案。保留住的是最小差距minNum,所以这个数加上目标数才是返回值。
    def threeSumClosest(self, nums, target):        nums.sort()        n = len(nums)        minNum = 9999999        for i in range(n):            start = i+1            end = n-1            while start < end:                tmp = nums[i]+nums[start]+nums[end]-target                if abs(tmp) < abs(minNum):                    minNum = tmp                if minNum == 0:                    return target                elif tmp < 0:                    start += 1                elif tmp > 0:                    end -= 1        return minNum+target
0 0
原创粉丝点击