1. 程式人生 > >LeetCode16-最接近的三數之和

LeetCode16-最接近的三數之和

不知為何,最近無心學習,以前愛看的書都不怎麼想看了,感覺每個月總有那麼幾天精神不濟啊,跟女生的生理週期一個樣。萎靡之後便會是熱情似火了,只能是這麼慰藉自己了。最近突然迷上了日本女明星了,看上去特別自然,我可不是崇洋媚外哈,更不是精日分子!只是覺得她們的外貌和性格更可愛,上面貼的圖片是我覺得蠻漂亮的上野樹里,跪舔女神,不要臉了哈!


16-最接近的三數之和

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

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

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

這一題其實是有個最簡單的方法,不用說,大家肯定想到的就是暴力搜尋法了。只需把數組裡所有元素三三結合得到的值以及減去目標值target得到的絕對值儲存在一字典裡,最後再用個sort()方法把字典裡的value值從小到大排序即可得到最接近target的值,思路很簡單,我這兒就沒有貼出程式碼了,有興趣的可以自行編輯。

我將要給出的演算法其實是借鑑了上一題求三數之和的思路,就是首先固定一個起始值,然後將剩餘的兩個值從兩端依次搜尋最接近的值,效果還是不錯的。

程式碼如下:

from math import inf


class Solution:
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if len(nums) < 3:
            return
        nums.sort()
        if sum(nums[:3]) >= target:
            return sum(nums[:3])
        if sum(nums[len(nums) - 3:len(nums)]) < target:
            return sum(nums[len(nums) - 3:len(nums)])
        close_target = inf
        close_num = nums[0]
        for index in range(len(nums)):
            start = index + 1
            end = len(nums) - 1
            while start < end:
                three_num = nums[index] + nums[start] + nums[end]
                if three_num == target:
                    return target
                if three_num < target:
                    start += 1
                if three_num > target:
                    end -= 1
                if abs(three_num - target) < close_target:
                    close_target = abs(three_num - target)
                    close_num = three_num
        return close_num


if __name__ == '__main__':
    nums = [0, 0, 0]
    target = 1
    close_target = Solution().threeSumClosest(nums=nums, target=target)
    print(close_target)

我測了幾次執行時間,基本上都是在70%左右上下徘徊的,還是很可喜的。