当前位置: 首页 > 后端技术 > Python

Leetcode第176期周赛-代码与讲解-python

时间:2023-03-26 15:01:51 Python

https://leetcode-cn.com/conte...第一题5340.有序矩阵中的统计负数https://leetcode-cn.com/conte...类解决方案:defcountNegatives(self,grid:List[List[int]])->int:n=len(grid)m=len(grid[0])c=0foriinrange(n-1,-1,-1):ifgrid[i][-1]>=0:breakforjinrange(m-1,-1,-1):ifgrid[i][j]<0:c+=1else:breakreturnc第二题5341.最后K个数的乘积https://leetcode-cn.com/conte...第一种可能是查询次数多,区间也可能很大。如果现在计算每个查询,它可能会超时。但是每个数字都很小。这时候考虑不存储数字本身,而是乘法的结果。例如,输入abcd。那么保存的就是a,a×b,a×b×c,a×b×c×d。所以。如果查询中的最后两个数字相乘,则意味着倒数第一个数除以倒数第三个数是(a×b×c×d)/(a×b)=c×d。这样,您只需要对每个查询进行一次除法,对每个输入进行一次乘法。使用python的优点之一是您不必担心整数溢出。这里还有一个问题没有处理,就是0。当时没想到,sample救了我,运行sample除了除数为0报错。0的思路是每次遇到0就清空list,因为前面的都是没用的,只要位置超过0,前面全是0。在对应的查询中,如果长度超过list的长度,0直接返回,因为之前肯定遇到过0。还有一个是为了代码方便,directlist的第一个默认带一个1。类ProductOfNumbers:def__init__(self):self.p=[1]defadd(self,num:int)->None:ifnum==0:self.p=[1]else:self.p.append(self.p[-1]*num)defgetProduct(self,k:int)->int:ifk>=len(self.p):return0returnself.p[-1]//self.p[-k-1]#你的ProductOfNumbers对象将被实例化并这样调用:#obj=ProductOfNumbers()#obj.add(num)#param_2=obj.getProduct(k)第三个问题5342.会议的最大数量可以参看https://leetcode-cn.com/conte...贪心算法。使用优先队列,从最小的一天开始。策略是按开始日期分组,每组(即每天)只取结束时间最早(即会议时长最短)的一组。然后,这会将集合中所有其他会议的开始时间修改为第二天,进入优先队列顺序。大致就是这样,但是可以有一些小的优化。例如,可以直接安排结束日期为处理当天的会议。因为这次会议的安排,绝对不会影响到后面的其他会议。整体的贪婪策略是尽可能安排最早结束日期在这一天的会议。importqueueclass解决方案:defmaxEvents(self,events:List[List[int]])->int:q=queue.PriorityQueue()foreinevents:q.put(e)e=q.get()cnt=1cd=e[0]+1而不是q.empty():e=q.get()ife[0]==cd:ife[1]>=cd:cd+=1cnt+=1elife[0]>cd:cd=e[0]+1cnt+=1else:#e[0]cd:e[0]=cdq.put(e)returncnt第四题5343.多次求和构造目标数组https://leetcode-cn.com/conte...好像很难,但是It找到规律后很容易实现。因为这两个步骤是交替进行的。所以:当前数组中最大的数一定是当前的x(代码中的current_x)。数组中所有数字的和减去最大数就是本次x相对于上一次x的增量(inc)。经wangtaoking1提醒,修改了循环更新x的方法。之前是x=x-val,现在是x=x%val。我的比赛代码可能已经超时了,但是测试数据很弱,所以就侥幸逃脱了。后来在zdyxry之后,@Gorilla提醒,做了两次修改。添加current_x%inc为0的判断原方法类解决方案:defisPossible(self,target:List[int])->bool:iflen(target)==1:returntarget[0]==1whileTrue:current_x=max(target)ifcurrent_x==1:returnTrue#最大数等于1且数组中没有小于1的数,则整个数组为1,returnTrueidx=target.index(current_x)inc=sum(target)-current_xtarget[idx]=current_x%incifinc>=current_xortarget[idx]==0:returnFalse#inc大于或等于x,所以会有一个值小于1,不合法,返回False欢迎来到我的博客:https://codeplot.top/我的博客主题分类:https://codeplot.top/categories/%E5%88%B7%E9%A2%98/