当前位置: 代码迷 >> 综合 >> 每天一道leetecode:16、最接近的三数之和(medium)
  详细解决方案

每天一道leetecode:16、最接近的三数之和(medium)

热度:96   发布时间:2023-12-14 15:04:23.0

emmmmmmmmmmmm,这道题其实和15题没啥区别,15题就是加和等于0就ok,这道题反而更简单,返回加和最近的。

当然,如果加和和target相同,直接返回0就ok了。

仍然采用:

1、先排序。

2、三个指针,一个从头部向尾部走,剩下两个在前面指针的后面前后移动。

这样最后的时间复杂度就是O(n^2)

如果理解了15题,解答这道题还是很简单的,如果没有理解15题的,请看我上一个博文。

啦啦啦

def threeSumClosest(nums, target):# 先对nums排序for i in range(len(nums)):for j in range(i+1,len(nums)):if nums[i] > nums[j]:res = nums[i]nums[i] = nums[j]nums[j] = resy = 0# 距离初始化为一个很大的值dis = 100000# 同三数之和==0,仍然设置三个指针进行遍历k = 0for k in range(len(nums)):i = k + 1j = len(nums) - 1while i < j:# 如果三数加和 - target 比原来的距离小,重新赋值if abs(nums[k] + nums[i] + nums[j] - target) < dis:print(nums[k],nums[i],nums[j])dis = abs(nums[k] + nums[i] + nums[j] - target)y = nums[k] + nums[i] + nums[j]if nums[k] + nums[i] + nums[j] > target:j -= 1elif nums[k] + nums[i] + nums[j] < target:i += 1elif nums[k] + nums[i] + nums[j] == target:return nums[k] + nums[i] + nums[j]elif abs(nums[k] + nums[i] + nums[j] - target) > dis:if nums[k] + nums[i] + nums[j] > target:j -= 1elif nums[k] + nums[i] + nums[j] < target:i += 1elif nums[k] + nums[i] + nums[j] == target:return nums[k] + nums[i] + nums[j]else:if nums[k] + nums[i] + nums[j] > target:j -= 1elif nums[k] + nums[i] + nums[j] < target:i += 1elif nums[k] + nums[i] + nums[j] == target:return nums[k] + nums[i] + nums[j]return ynums = list()
nums.append(0)
nums.append(1)
nums.append(2)print(threeSumClosest(nums,3))

结果:

  相关解决方案