算法思路:跟上提的三数之和为0的题目解题思路一样,但是不同的地方在于它多包含了一个target,所以在计算的时候直接把target减掉,就是计算三数之和和0的距离了,所以是绝对值。
那在这里的迭代算法思路是什么。首先,循环的第一个指针是从左到右的元素以次进行迭代,然后第二个和第三个指针是L和R,刚开始是第一个指针i右边的第一个元素,R是最右边的元素,然后计算三数之和,如果该三数之和减去target的值为正数,那就要减小它,所以是R指针元素向右移一位;如果该三数之和减去target的值为负数,那就要增大它,那就是L指针向右移一位,在这里你们可能会问,为什么在减小的时候,不对L左移一位操作,因为在i指针从左到右的情况下,如果你进行L左移可能会跟遍历过的i重合,且可能会对已经进行判断过的三个数再次进行判断。如果刚好等于0就直接退出。
算法步骤:
1、对得到的列表进行排序。
2、进行三指针迭代,i指针指向数从左到右进行移动,
3、定L和R指针,L=i+1,R=len(nums)-1,即R指针目前是数组中的最后一位。
4、如果nums[i]+nums[L]+nums[R]-target>0,那么R就向左移一位,如果nums[i]+nums[L]+nums[R]-target<0。L就向右移一位,如果刚好等于0,那就直接退出,因为已经是最接近的了。
5、继续迭代直到L=R。
6、继续迭代直到i=len(nums)。
from typing import List
class Solution:
def threeSumClosest(self, nums: List[int], target: int):
if(len(nums)<3):
return []
nums.sort() #对列表进行排序
result = []
close = 1000
for i in range(0,len(nums)-2):
L = i+1
R = len(nums)-1
while(L<R):
sum = nums[i]-target + nums[L] + nums[R]
if (abs(sum) < abs(close)):
re = [nums[i], nums[L], nums[R]]
close = sum
if(sum<0):
L += 1
elif(sum>0):
R -= 1
else:
re = [nums[i],nums[L],nums[R]]
L += 1
R -= 1
return close+target
return close+target
#nums = [1]
nums = [-1,2,1,-4]
out = Solution().threeSumClosest(nums,1)
print(out)