LeetCode16-最接近的三數之和
阿新 • • 發佈:2018-11-19
不知為何,最近無心學習,以前愛看的書都不怎麼想看了,感覺每個月總有那麼幾天精神不濟啊,跟女生的生理週期一個樣。萎靡之後便會是熱情似火了,只能是這麼慰藉自己了。最近突然迷上了日本女明星了,看上去特別自然,我可不是崇洋媚外哈,更不是精日分子!只是覺得她們的外貌和性格更可愛,上面貼的圖片是我覺得蠻漂亮的上野樹里,跪舔女神,不要臉了哈!
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%左右上下徘徊的,還是很可喜的。