力扣每日一题(十——最接近的三数之和)

仅以此纪录每日LeetCode所刷题目(偷个懒,写一道以前做过的题目)

题目描述:

示例:

思路:

在看到这道题的时候,首先想起的方法是暴力迭代法,这道题最后只需要输出和target最近的解,而不是分别输出三个数,因此这道题使用暴力迭代法求解时间和内存也不会超标(当然排名会靠后),因为是三个数的总和,因此我们首先建立一个列表将所有可能的三个数的总和存放在列表之中。之后我们在逐一求出每个总和数值与target目标值的插值(这里要取绝对值,因为我们无法判断他是在target的左面还是右面)。之后我们将列表进行一个sorted排序,得出最小的距离值。因为我们无法判断该值是在target的左面还是右面,因此我们得出两个可能解。最后我们需要判断哪个解在数组中(题目中假定只含有唯一解),在数组中的解就是最后的答案。

代码:

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        count = []
        result = []
        for i in range(len(nums)-2):
            for j in range(i+1,len(nums)-1):
                for k in range(j+1,len(nums)):
                    a =0
                    a = nums[i] + nums[j] + nums[k]
                    count.append(a)
        if target in count:
            return target
        for i in range(len(count)):
            a = 0
            a = abs(count[i]-target)
            result.append(a)
        result = sorted(result)
        if target + result[0] in count:
            return target + result[0]
        else:
            return target - result[0]

 大神思路:

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums, r, end = sorted(nums), float('inf'), len(nums) - 1
        for c in range(len(nums) - 2):
            i, j = max(c + 1, bisect.bisect_left(nums, target - nums[end] - nums[c], c + 1, end) - 1), end
            while r != target and i < j:
                s = nums[c] + nums[i] + nums[j]
                r, i, j = min(r, s, key=lambda x: abs(x - target)), i + (s < target), j - (s > target)
        return r

明天更新 详细讲解一下这里的python函数用法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值