LeetCode[007]

题目:最接近的三数之和

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

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

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

初步尝试:

class Solution:
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        l = []
        L = []
        nums_l = len(nums)
        for a in range(nums_l):
            for b in range(nums_l):
                for c in range(nums_l):
                    if (a!=b) and (a!=c) and (b!=c):
                        result = (nums[a] + nums[b] + nums[c] - target)
                        l.append(result)
        for i in l:
            i = abs(i)
            L.append(i)
            MIN = L.index(min(L))
        
        return l[MIN]+target

算法是没什么毛病,但是这几个循环下来,太慢了。

其他思路:

一开始对列表进行排序,按照顺序取数,然后取第二个数和最后一个数。将三数之和和目标值进行比较,相同就直接输出。如果目标值大于三数之和,由于是顺序列表,最后一个数向前进一位进行比较,如果目标值小于三数之和,第二个数前进一位。这样做的话,只用循环一次就历遍了整个列表。

class Solution:
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        nums.sort()
        res = sum(nums[:3])
        # 设置阈值
        m = abs(res - target)
        for i in range(len(nums)):
            l = i+1  
            r = len(nums)-1
            while l < r:
                temp = nums[i] + nums[l] +nums[r]
                if abs(temp-target) < m:
                    res = temp
                elif target < temp:
                    r -=1
                else :
                    l +=1
        return res

值得一提的是,如果在一开始就设定好阈值,而不是调用给定数据本身的数设置阈值,官方网站完成测试的速度会快很多。但是在时间复杂度上,两者应该是一样的。具体原因不太清楚。

class Solution:
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        mindiff = 10000
        nums.sort()
        res = 0
        for i in range(len(nums)):
            left = i+1
            right = len(nums)-1
            while left < right:
                sum = nums[left] + nums[right] + nums[i]
                diff = abs(target - sum)
                if diff < mindiff:
                    mindiff = diff
                    res = sum
                if target == sum:
                    return sum
                elif sum < target:
                    left += 1
                else:
                    right -= 1                      

        return res

参考文章:
https://blog.csdn.net/weixin_42304045/article/details/80490107
https://blog.csdn.net/iyuanshuo/article/details/79600106

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值