LeetCode.16.最接近的三数之和(中等)

题目描述:

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解

输入输出实例:

思路:如果直接使用三层循环遍历的话,多半是要超时的,所以还是选择使用双指针来做减少时间复杂度。

        我们先对数组进行排序,然后定义一个超级大的数后面用于和我们的三数和比较,遍历数组,nums[i]作为第一个元素,nums[left],nums[right]作为第二三个元素,如果三数和减去target直接等于0了那我们直接返回target就可以了,让存储三数和的变量不断趋近于target(不要忘记使用绝对值)

       最后我们把最接近target的用于存储三数和的变量返回。最后由于我们的数组是排序过的,如果当前三数和比target大我们最右边的指针往左移,同理移动左指针。

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        #采用双指针
        nums.sort()
        min_count = 99999
        ans_count = 0
        for i in range(0,len(nums)-2):
            left,right = i+1,len(nums)-1
            while left < right :
                if nums[i]+nums[left]+nums[right]-target==0 :
                    return target
                if abs(nums[i]+nums[left]+nums[right]-target) < min_count:
                    min_count = abs(nums[i]+nums[left]+nums[right]-target)
                    ans_count = nums[i]+nums[left]+nums[right]
                if nums[i]+nums[left]+nums[right] > target :
                    right -= 1
                elif nums[i]+nums[left]+nums[right] < target :
                    left += 1
        return ans_count

对于这段代码还有优化的地方,这样提交上去时间太久了,所以做了一些更改,更改后的代码如下:

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        #采用双指针
        nums.sort()
        min_count = 99999
        for i in range(0,len(nums)-2):
            left,right = i+1,len(nums)-1
            while left < right :
                current_count = nums[i]+nums[left]+nums[right]
                if abs(current_count-target) < abs(min_count-target) :
                    min_count = current_count
                if current_count > target :
                    right -= 1
                elif current_count < target :
                    left += 1
                else :
                    return current_count
                
        return min_count

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值