三数之和这道题被反复考到,但是我一次都没给写出来,真是汗颜!本题是三数之和的一道变形题,也是一道好题!本题有两个关键点:其一,双指针是怎么个用法?在本题中是怎么实现的?其二,如何判断要终止当前的这轮迭代?与target这个值进行比较,决定该怎么迭代查找。
1. 题目
2. 分析
这题与三数之和相似。
第一重for
循环用来从头到尾的找数(遍历完所有的状态),然后使用second
、third
这两个指针(双指针)判断该怎么取较优结果。
3. 代码
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
res = []
nums.sort()
res.extend( [nums[0], nums[1], nums[2]]) # 直接初始化
for first in range(len(nums)):
third = len(nums) - 1
for second in range(first+1, third):
# if second != first + 1 and nums[second] == nums[second-1]:
# continue
while second < third:
# 判断和的情况
if (abs(nums[first] + nums[second] + nums[third]-target) < abs(sum(res) - target)):
print("1", res)
res.clear()
res.extend( [nums[first], nums[second], nums[third]])
# 要清楚在什么时候进行third值的操作
if nums[first] + nums[second] + nums[third] > target:
third -= 1
elif nums[first] + nums[second] + nums[third] < target:
break
else:
return sum(res)
print(res)
return sum(res)