LeetCode #16 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

浙公网安备 33010602011771号