最接近的三数之和-排序+双指针
Posted xiao-longxia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最接近的三数之和-排序+双指针相关的知识,希望对你有一定的参考价值。
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
处理几数之和流程一般是先将数组进行排序,然后使用双指针左右逼近,外层再循环遍历数组,这样每次就可以得到三个数
本题算法流程:
1.特殊情况,若数组是三个数,直接返回三数之和
2.对数组进行排序
3.遍历排序后的数组:
对于重复元素,跳过,优化执行时间
令左指针left=i+1,右指针Right=n-1,当left<right,执行循环:
计算nums[i]+nums[left]+nums[right]三数之和,以及和target差值diff
如果diff的绝对值比mindiff小,则更新mindiff和closestSum
如果diff==0,直接返回三数之和
如果diff<0,说明threeSum<target,left指针右移
如果diff>0,说明threeSum>target,right指针左移
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
# 特判:n=3,返回sum(nums)
n = len(nums)
if n == 3:
return sum(nums)
# 令最小差的绝对值为无限大
minDiff = float("inf")
closestSum = 0
# nums排序
nums.sort()
# 遍历nums
for i in range(n-2):
if i > 1 and nums[i] == nums[i-1]:
continue
# 双指针
Left = i + 1
Right = n - 1
while Left < Right:
threeSum = nums[i] + nums[Left] + nums[Right]
diff = threeSum - target
# 如果diff的绝对值比minDiff小,那么更新minDiff和closestSum
if abs(diff) < minDiff:
minDiff = abs(diff)
closestSum = threeSum
if diff == 0:
# 如果diff为0,直接返回threeSum
return closestSum
elif diff < 0:
# 说明threeSum < target,L右移
Left += 1
while(Left<Right and nums[Left]==nums[Left-1]):#去重
Left +=1
else:
# 说明threeSum > target,R左移
Right -= 1
while(Left<Right and nums[Right]==nums[Right+1]):#去重
Right -= 1
return closestSum
以上是关于最接近的三数之和-排序+双指针的主要内容,如果未能解决你的问题,请参考以下文章