16.三數之和

給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。

例如,給定數組 nums = [-1,2,1,-4], 和 target = 1.

與 target 最接近的三個數的和爲 2. (-1 + 2 + 1 = 2).

class Solution:
    def threeSumClosest(self, nums, target):
        size = len(nums)
        # 特判
        if size < 3:
            return []
        # 初始化,因爲找最小值,因此把初始值設置成實數的最大值
        diff = float('inf')

        # 排序是前提
        nums.sort()

        for i in range(size - 2):
            # 常見的剪枝操作
            if i > 0 and nums[i] == nums[i - 1]:
                continue
            # 雙指針:指針對撞
            left = i + 1
            right = size - 1
            while left < right:
                s = nums[i] + nums[left] + nums[right]

                if abs(s - target) < diff:
                    diff = abs(s - target)
                    res = s

                # 不管是變小還是變大,嘗試的作用是讓 s 與 target 更接近
                # 即 s 與 target 的絕對值之差越來越小
                if s > target:
                    # 如果大了,嘗試右邊界收縮一格,讓 target 變小
                    right -= 1
                elif s < target:
                    # 如果小了,嘗試左邊界收縮一格,讓 target 變大
                    left += 1
                else:
                    # 如果已經等於 target 的話, 肯定是最接近的,根據題目要求,返回這三個數的和
                    return target
        return res

if __name__ == '__main__':
    solution = Solution()
    print(solution.threeSumClosest([-1,2,1,-4],1))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章