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%左右上下徘徊的,还是很可喜的。