基础算法(Leetcode)刻意练习第四天——最接近的三数之和

思路:首先想到的也是双指针,但是第一次处理可能细节不太好,总是超时,后来用了另一种思路,将两个指针分开,然后去求,若大于则右指针左移,小于则相反。其中再做特殊化处理,比如去重,仅当符合条件后,将符合条件的重复的数移除。从运行来看这是一个非常笨重的办法。。。在这里插入代码片
import numpy as np
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res=[]
len_nums=len(nums)
if len_nums<3:return res
nums.sort()
for i in range(len_nums):
if nums[i]>0:return res
if i>0 and nums[i]==nums[i-1]:continue
left=i+1
right=len_nums-1
while left<right:
if nums[i]+nums[left]+nums[right]==0:
res.append([nums[i],nums[left],nums[right]])
#处理相同情况:
while left+1<right and nums[left]==nums[left+1]:left=left+1
while left<right-1 and nums[right]==nums[right-1]:right=right-1
#如果这次已经相等,又不允许有相同情况出现,故让左右指针都移动一个格
left=left+1
right=right-1
if nums[i]+nums[right]+nums[left]>0:
right=right-1
elif nums[i]+nums[right]+nums[left]<0:left=left+1
return res

另一附一个大佬的超级代码,说实话没太看明白。。。`留下来慢慢研究吧。。。

class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
ans = []
counts = {}
for i in nums:
counts[i] = counts.get(i, 0) + 1

    nums = sorted(counts)

    for i, num in enumerate(nums):
        if counts[num] > 1:
            if num == 0:
                if counts[num] > 2:
                    ans.append([0, 0, 0])
            else:
                if -num * 2 in counts:
                    ans.append([num, num, -2 * num])
        if num < 0:
            two_sum = -num
            left = bisect.bisect_left(nums, (two_sum - nums[-1]), i + 1)
            for i in nums[left: bisect.bisect_right(nums, (two_sum // 2), left)]:
                j = two_sum - i
                if j in counts and j != i:
                    ans.append([num, i, j])

    return ans`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值