给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个 数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路一:暴力法 O(n^3)
# 我们都做题做到现在了,除非没思路的题才用暴力法吧~~
思路二:双指针 O(n^2) 类似于 3sum
- 首先进行数组排序,时间复杂度O(nlogn)
- 外循环遍历 nums[:-2], 得到固定值 nums[i]
- 内循环遍历 nums[i:], 使用 j, k = i+1, len(nums)-1 遍历,得到 nums[j].nums[k]
- 根据这三数之和 s 与 target 的距离更新 res, 距离小则更新
- 由于 nums 已是升序,则根据 s 与 target 的大小关系,将 j, k 指针左移或右移
class Solution:
def threeSumClosest(self, nums, target) -> int:
res = float('-inf')
nums.sort()
for i in range(len(nums)-2):
if i > 0 and nums[i] == nums[i-1]: continue # 不影响代码可观赏性时适当剪枝
j,k = i+1,len(nums)-1
while j < k:
s = nums[i] + nums[j] + nums[k]
if s == target:
return s
res = s if abs(s-target) < abs(res-target) else res
if s > target:
k -= 1
elif s < target:
j += 1
return res