三数之和 (力扣刷题笔记)

先是利用的迭代的方法,三个加起来等于零来添加元素,之后再将列表中的列表排序,再利用条件从句把相同的元素剔除,今天力扣平台死活加载不出来运行的界面:在这里插入图片描述
暂且记录下代码,之后测试之后再继续记录:

nums = [-1,0,1,2,-1,-4]
new=[]
for i in range(len(nums)-2):
    for j in range(i+1,len(nums)-1):
        for k in range(j+1,len(nums)):
            if nums[j]+nums[k]==-nums[i]:
                new.append([nums[i],nums[j],nums[k]])
            print(f'i={i},j={j},k={k}')
            print(new)
for i in range(len(new)):
    new[i]=sorted(new[i])
print(new)
nums=[]
for i in new:
    if i not in nums:
        nums.append(i)
print(nums)                

时间超了…
之后通过参考别人的思路自己把这个写出来了,然后遇到了后面的题目的问题,三数之和最接近的数,这里记录下自己的错误代码吧,错误一,可以实现不重复右移左移,但是不知道为什么不能按照我的想法来:

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        def change_(new,oringin,target):
            if abs(new-target)<abs(oringin-target):
                return new
            else:
                return oringin
        res=10**8
        nums.sort()
        if len(nums)==3:
            return sum(nums)
        print(nums)
        for i in range(len(nums)-2):
            l=i+1
            r=len(nums)-1
            while True:
                if l>=r:
                    break
                sums=nums[i]+nums[l]+nums[r]
                res=change_(sums,res,target)
                print('nums',nums[i],nums[l],nums[r])  
                print('res',res,sums,target)            
                if sums==target:
                    return target
                elif sums>target:
                    l+=1
                    if l<r:
                        while nums[l]==nums[l+1]:
                            if l>=len(nums)-2:
                                break
                            l+=1
                elif sums<target:
                    r-=1
                    if l<r:
                        while nums[r]==nums[r-1]:
                            if r<=1:
                                break
                            r-=1
        return res

同时也记录下自己半天做不出来一道题的悲惨遭遇哈哈哈,前一秒被三数之和虐,后一秒被最接近的三数之和虐。
在这里插入图片描述

在这里插入图片描述
感觉这两个题目有个共通的地方就是可以用两个指针的方法,但是不知道为什么这个题目用双指针没有很有用…之后检测之后发现是少加了一层循环,只变化了一次,变化之后还是有问题,结果发现是循环跳出条件没判断,然后又移动了下代码的顺序,终于的终于:
在这里插入图片描述
虽然不甚理想,但是终于过了,看的时候都是忐忑的等待着,代码就是基本的双指针+排序如下:

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums.sort()
        # print(nums)
        self.ans=inf
        self.sums=inf
        def check():
            if abs(self.ans-target) > abs(self.sums-target):
                self.ans=self.sums
        for i in range(len(nums)-2):
            l=i+1
            r=len(nums)-1
            
            while True:
                
                if r==l:
                    break
                # print(nums[i],nums[l],nums[r])
                self.sums=nums[i]+nums[l]+nums[r]
                check()
                if self.sums==target:
                    return target
                elif self.sums>target:
                    r0=r-1
                    while nums[r]==nums[r0] and l<r0:
                        r0-=1
                    r=r0
                elif self.sums<target:
                    l0=l+1
                    while nums[l]==nums[l0] and l0<r:
                        l0+=1
                    l=l0
        return self.ans

这次应该是玩力扣以来第一次错误提交这么多次,太折磨了。
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值