leetcode第十六题 —— 最接近的三数之和
2019-11-18 本文已影响0人
不分享的知识毫无意义
1.题目
原题
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例子
输入: nums = [-1,2,1,-4], target = 1。
输出: 2。
解释:-1+1+2 = 2与给定的目标1最为接近。
2.解析
这道题最简单的解法就是暴力求解法,即用一个三层循环就可以完成任务,但是这其中会有重复计算,时间复杂度也很高,为o(n^3)。
肯定有简化的办法:
1)对输入数组进行排序
2)设置数组初始位置变量i和终止位置变量k
3)计算三数和与target想比是大还是小,因为是排序数组,如果大于target就减少k的值,如果小于target就增加i的值。
4)将当前值与最小的和与target差值比较,小就更新。
此题的关键在于遍历下标的设置。
3.python代码
class Solution:
def threeSumClosest(self, nums, target):
nums.sort()
nearst_sum = nums[0] + nums[1] + nums[2]
for i in range(len(nums)):
j = i + 1
k = len(nums) - 1
while j < k:
tmp = nums[i] + nums[j] + nums[k] - target
if tmp == 0:
return target
elif tmp < 0:
if abs(tmp) < abs(nearst_sum - target):
nearst_sum = tmp + target
j += 1
elif tmp > 0:
if abs(tmp) < abs(nearst_sum - target):
nearst_sum = tmp + target
k -= 1
return nearst_sum