LeetCode #16 3Sum Closest

题目

3Sum Closest


解题方法

返回值是三个数相加的和,不需要返回具体的三个数,因此考虑可以遍历数组寻找一个最接近的sum,但这种三个数的暴力破解必超时。

改进:可以联想到先将数组升序排序,从头向后找到一个最接近的sum,找到之后直接break掉,可以节省时间。但这样仍然不足够,因为如果三个数全都从头向后找,那么如果在某种情况下的sum是由第一个数,中间一个数,和最后一个数相加得到的,这种方法就会需要多次遍历整个数组,而且如果break的条件设置不好,也很有可能会得到错误的结果。

再改进:参考之前3Sum类题目的做法,可以联想到先将其中一个数固定住,然后再从比这个固定大的数中选两个数与这个固定数组合成sum,为了加速判断过程,可以分别从剩下的数中选取头和尾开始向中间靠拢。如果得到的sum与target相等,则可以直接得到答案,如若不然,最坏的时间复杂度是O(n^2)。


代码

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        diff = 20000
        nums.sort()
        
        for i in range(len(nums)):
            low = i + 1
            high = len(nums) - 1
            
            while low < high:
                Sum = nums[i] + nums[low] + nums[high]
                if abs(diff) > abs(target - Sum):
                    diff = target - Sum
                if target > Sum:
                    low += 1
                else:
                    high -= 1
            
            if not diff:
                break
        
        return target - diff
posted @ 2020-10-09 09:20  老鼠司令  阅读(91)  评论(0)    收藏  举报