【LeetCode刷题】16.最接近的三数之和

题目:16. 最接近的三数之和

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

示例:

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

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

解题思路

依旧是双指针的问题。

  • nums排序(从小到大)。
  • 双指针
    1>.先定义3个指针,一个固定指针i,两个左右指针L,R
    2>.令i固定数组的最左边,作为新动态数组的左边界,即i=0;
  • 同时,L=i+1,R=len(nums) -1,即分别指向新数组的两端;
  • 用i遍历数组,作为外循环,不断的将左边界向右推进,逐渐缩小新数组的长度;
  • 比较 sum=nums[i]+nums[L]+nums[R]目标值target的大小;
  • sum==0, 符合要求,存入res,之后,L+1,R-1;
  • sum<0, L+1;
    (因为数组是从小到大排序过的,当sum<0,三个数整体来说是偏小的,自然要让三数中最小的数nums[L]变大,即指针L向右移动)
  • sum>0,R-1;
    (同理,sum偏大,就让最大的值nums[R]变小)

代码(Python)

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        #错误判断,数组长度小于3,直接返回
        if(not nums or len(nums)<3):
            return []
        nums.sort()
        #给res赋初值
        res=nums[0]+nums[1]+nums[2]
        #外循环
        for i in range(len(nums)-2): 
            #排除重复的nums[i]
            if(i>0 and nums[i]==nums[i-1]):
                continue
        	#初始化左右指针
            L=i+1
            R=len(nums)-1   
            #边界判断       
            while L<R:  
                sum = nums[i]+nums[L]+nums[R]  
   
                if abs(sum-target)<abs(res-target):
                    res=sum

                #sum偏小,L向右移动
                if sum-target < 0:
                    L=L+1
                #sum偏大,L向左移动
                elif sum-target > 0:
                    R=R-1
                else:
                    return target
                    
                #排除重复的nums[L],nums[R]
                while(L<R and nums[L]==nums[L+1]):
                    L=L+1
                while(L<R and nums[R]==nums[R-1]):
                    R=R-1
        return res

总结

最接近的最接近的三数之和其实和三数之和几乎一样!同样是双指针的应用。好了,没看懂的可以回头看看我的上一篇博客三数之和完结撒花~
在这里插入图片描述

后续

同时,贴上咱的个人博客,欢迎客官大老爷们来访~
青枫阁

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值