问题描述:
最接近的三数之和
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
问题分析:
与15题相似,可以先从小到大排序,然后固定一个值,从这个值的右区间开始,设置两个指针 left, right向最近值逼近。
(1)对nums从小到大排序。
(2)遍历(或者是枚举)取出一个值,并确定右区间和指针 left, right。
(3)更新最优值,已经根据当前三个数的和,移动指针 left, right。
(4)继续(2)(3)直至结束。
Python3实现:
# @Time :2018/7/6
# @Author :LiuYinxing
class Solution:
def threeSumClosest(self, nums, target):
n = len(nums)
nums.sort() # 排序
result = nums[0] + nums[1] + nums[2]
for i in range(n - 2):
left, right = i + 1, n - 1
while left < right:
sum = nums[i] + nums[left] + nums[right]
if sum == target: return sum
if abs(sum - target) < abs(result - target): result = sum #更新最优值
if sum < target: left += 1 # 向右移动
elif sum > target: right -= 1 # 向左移动
return result
if __name__ == '__main__':
solu = Solution()
nums, target = [-1, 0, 1, 2, -1, -4], 4
print(solu.threeSumClosest(nums, target))
欢迎指正哦。