力扣刷题(python)50天——第十天:最接近的三数之和

力扣刷题(python)50天——第十天:最接近的三数之和

题目描述

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解决:

看到第一反应就是和上一题很像,但区别也很大。
依然先排序,后固定最小值,再找另外两个值时,和上题对比,我认为左右指针逐渐向内移动的方法并不能找到最接近的值,于是先后采用了逐两个连续项依次同时向右移动指针,二分法,暴力破解(超时,偶尔能通过)的方法,均以失败告终,最后查找资料

https://leetcode-cn.com/problems/3sum-closest/solution/hua-jie-suan-fa-16-zui-jie-jin-de-san-shu-zhi-he-b/

但依然没有明确说明为什么左右指针按链接内的规则逐渐向内移动可以得到最优解,现说说我的理解:
对于[a,b,c,d,e,f,g]
如果最优解在b,d,f处取得,那么根据移动的规则,一定有某次,我的左或右指针指向d或f。现以指针到b,c,f为例:

如果此时三者之和大于0,那么右指针不久向左移动了,就取不到最优解了吗????????

其实,问题出在如果此时是大于target的,那么假设的最优解也一定是大于target的,且b,c,f一定比假设的最优解要优化,

因此假设不成立

因此该方法可以找到最优解!!!!!!!!!

最终答案:

class Solution(object):
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        nums.sort()
        l=len(nums)
        if l==3:
            return nums[0]+nums[1]+nums[2]
        final=nums[0]+nums[1]+nums[2]
        for i in range(l-2):
            left=i+1
            right=l-1
            while 1:
                s=nums[i]+nums[left]+nums[right]
                if abs(s-target)target:
                    right-=1
                elif s

执行结果

力扣刷题(python)50天——第十天:最接近的三数之和_第1张图片

心得:

对双指针的方法又加深了点w(゚Д゚)w。。

你可能感兴趣的:(leetcode刷题)