先是利用的迭代的方法,三个加起来等于零来添加元素,之后再将列表中的列表排序,再利用条件从句把相同的元素剔除,今天力扣平台死活加载不出来运行的界面:
暂且记录下代码,之后测试之后再继续记录:
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
这次应该是玩力扣以来第一次错误提交这么多次,太折磨了。