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]
