【LeetCode】16. 3Sum Closest(Python)

Problem

最接近的三数之和

Algorithmic thinking

双指针法

Python3 solution

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
16. 最接近的三数之和

eg:
target=3, list=[1,2,3,1]
最接近的值:1+1+2=4,返回整型数值:4
"""


class Solution:
    def three_sum_closest(self, nums, target):
        """
        :param nums: list[int]
        :param target: int
        :return: res's type is int
        """
        nums.sort()
        res = sum(nums[:3])
        for i in range(len(nums)):
            ls, r = i+1, len(nums)-1
            while ls < r:
                s = sum((nums[i], nums[ls], nums[r]))
                if abs(s-target) < abs(res-target):
                    res = s
                if s < target:
                    ls += 1
                elif s > target:
                    r -= 1
                else:
                    return res
        return res


class Solution2:
    def threeSumClosest(self, nums: 'List[int]', target: 'int') -> 'int':
        nums.sort()
        # result = nums[0]+nums[1]+nums[2]
        close = []
        for i in range(0, nums.__len__()-2):
            j, k = i+1, nums.__len__()-1
            if nums[i]+nums[k-1]+nums[k] < target:
                close.append(nums[i]+nums[k-1]+nums[k])
            elif nums[i]+nums[j]+nums[j+1] > target:
                close.append(nums[i]+nums[j]+nums[j+1])
            else:
                while j < k:
                    temp = nums[i]+nums[j]+nums[k]
                    if temp == target:
                        return temp
                    close.append(temp)
                    if temp < target:
                        j += 1
                    else:
                        k -= 1
        closest = sorted(close, key=lambda x: abs(target-x))
        return closest[0]


if __name__ == '__main__':
    sl_1 = [-1, 3, 3, 2, 1]
    result = Solution().three_sum_closest(sl_1, 3)
    print(result)
    result2 = Solution2().threeSumClosest(sl_1, 3)
    print(result2)

猜你喜欢

转载自blog.csdn.net/Yuyh131/article/details/88638250