这周的周赛比较简单。5328.方阵中战力最弱的K行问题,数组排序,https://leetcode-cn.com/conte...需要返回1最少的前k行,返回第一个如果有多达1个,则首先使用最小的下标。计算每行有多少个1。排序返回第一个k下标类解决方案:defkWeakestRows(self,mat:List[List[int]],k:int)->List[int]:n=len(mat)m=len(mat[0])x=[[sum(l)*(n+1)+(i),i]fori,linenumerate(mat)]x.sort(key=lambdax:x[0])return[x[i][1]foriinrange(k)]5329。数组的大小减半。https://leetcode-cn.com/conte...先求数组的长度。查找数组中每个元素的出现次数。将次数从大到小排序,依次遍历累加,直到超过一半长度返回,累加若干个数collections.Counter(arr)l=len(arr)x=list(cnt.values())x.sort(reverse=True)ans=0c=0whilecint:self.sum=0self.cur_t=0defget_sum(r):ifr:self.sum+=r.valifnotr.leftandnotr.right:self.cur_t=r.valelse:get_sum(r.left)get_sum(r.right)get_sum(root)self.target=self.sum/2self.cur_x=abs(self.target-self.cur_t)#print(self.sum,self.target,self.cur_t,self.cur_x)deffind_tar(r):如果r:s=r.vals+=find_tar(r.left)s+=find_tar(r.right)cur_x=abs(s-self.target)如果cur_xint:l=len(arr)mp=[[]foriinrange(l)]foriinrange(l):j=i-1whilej>=0:ifi-j>d:breakifarr[j]>=arr[i]:中断mp[i].append(j)j-=1j=i+1whilejd:breakifarr[j]>=arr[i]:中断mp[i].append(j)j+=1ansx=[0]*ldefdfs(i):ifansx[i]!=0:returnansx[i]iflen(mp[i])==0:ansx[i]=1return1ans=dfs(mp[i][0])fortoid在mp[i][1:]:ans=max(ans,dfs(toid))ansx[i]=ans+1returnans+1ans=dfs(0)foriinrange(1,l):ans=max(ans,dfs(i))returnans使用functools.lru_cache的代码:importfunctoolsclass解决方案:defmaxJumps(self,arr:List[int],d:int)->int:l=len(arr)mp=[[]foriinrange(l)]foriinrange(l):j=i-1whilej>=0:如果i-j>d:breakifarr[j]>=arr[i]:breakmp[i].append(j)j-=1j=i+1whilejd:breakifarr[j]>=arr[i]:breakmp[i].append(j)j+=1@functools.lru_cache(无)defdfs(i):iflen(mp[i])==0:return1ans=dfs(mp[i][0])fortoidinmp[i][1:]:ans=max(ans,dfs(toid))returnans+1ans=dfs(0)foriinrange(1,l):ans=max(ans,dfs(i))returnans我的博客:https://codeplot.top/我的刷题:https://codeplot.top/categories/刷题问题/