题目:16. 最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
解题思路
依旧是双指针的问题。
- 将nums排序(从小到大)。
- 用双指针:
1>.先定义3个指针,一个固定指针i,两个左右指针L,R;
2>.令i固定数组的最左边,作为新动态数组的左边界,即i=0; - 同时,L=i+1,R=len(nums) -1,即分别指向新数组的两端;
- 用i遍历数组,作为外循环,不断的将左边界向右推进,逐渐缩小新数组的长度;
- 比较 sum=nums[i]+nums[L]+nums[R] 和目标值target的大小;
- sum==0, 符合要求,存入res,之后,L+1,R-1;
- sum<0, L+1;
(因为数组是从小到大排序过的,当sum<0,三个数整体来说是偏小的,自然要让三数中最小的数nums[L]变大,即指针L向右移动) - sum>0,R-1;
(同理,sum偏大,就让最大的值nums[R]变小)
代码(Python)
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
#错误判断,数组长度小于3,直接返回
if(not nums or len(nums)<3):
return []
nums.sort()
#给res赋初值
res=nums[0]+nums[1]+nums[2]
#外循环
for i in range(len(nums)-2):
#排除重复的nums[i]
if(i>0 and nums[i]==nums[i-1]):
continue
#初始化左右指针
L=i+1
R=len(nums)-1
#边界判断
while L<R:
sum = nums[i]+nums[L]+nums[R]
if abs(sum-target)<abs(res-target):
res=sum
#sum偏小,L向右移动
if sum-target < 0:
L=L+1
#sum偏大,L向左移动
elif sum-target > 0:
R=R-1
else:
return target
#排除重复的nums[L],nums[R]
while(L<R and nums[L]==nums[L+1]):
L=L+1
while(L<R and nums[R]==nums[R-1]):
R=R-1
return res
总结
最接近的最接近的三数之和其实和三数之和几乎一样!同样是双指针的应用。好了,没看懂的可以回头看看我的上一篇博客三数之和完结撒花~
后续
同时,贴上咱的个人博客,欢迎客官大老爷们来访~
青枫阁