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

猜你喜欢

转载自blog.csdn.net/weixin_36431280/article/details/84098535