【leetcode】最接近的三数之和,python实现

算法思路:跟上提的三数之和为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)

    原文作者:糊涂不是傻
    原文地址: https://blog.csdn.net/weixin_43872912/article/details/123528423
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞