第 86 场双周赛 总结
和相等的子数组
简单题,从头到尾两两标记计算
class Solution:
def findSubarrays(self, nums: List[int]) -> bool:
vis={}
for i in range(1,len(nums)):
temp=nums[i]+nums[i-1]
if temp in vis:
return True
else:
vis[temp]=1
return False
严格回文的数字
根据进制构造字符串,反转后判断
class Solution:
def isStrictlyPalindromic(self, n: int) -> bool:
def turn(tar,pos):
lst=[]
while (tar//pos!=0):
lst.append(tar%pos)
tar=tar//pos
lst.append(tar%pos)
lst=''.join(str(lst))
return lst==lst[::-1]
for i in range(2,n-1):
if turn(n,i):
continue
else:
return False
return True
不过看完大佬的题解,发现始终无法满足条件
直接返回false即可
被列覆盖的最多行数
一开始陷入了贪心的陷阱里,后来发现似乎贪心是错的
看了下m,n数据量,可以直接暴力枚举出来
class Solution:
def maximumRows(self, mat: List[List[int]], cols: int) -> int:
res,add = 0,0
row=defaultdict(list)
for i in range(len(mat)):
for j in range(len(mat[0])):
if mat[i][j]==1:
row[i].append(j)
if i not in row:
add+=1
Max_len=len(mat[0])
for item in combinations(list(range(len(mat[0]))), cols):
cnt=0
item=set(item)
for k,v in row.items():
flag=1
for rr in v:
if rr not in item:
flag=0
break
if flag:
cnt+=1
res=max(res,cnt)
return res+add
预算内的最多机器人数目
一开始题目理解错了,以为机器人直接可以不连续,想半天dp想不出来,后来发现机器人必须连续
那就滑动窗口再维护一个递减的单调队列即可
class Solution:
def maximumRobots(self, chargeTimes: List[int], runningCosts: List[int], budget: int) -> int:
left,res=0,0
cnt = 0
q=deque()
for right,(c,r) in enumerate(zip(chargeTimes,runningCosts)):
while q and c>chargeTimes[q[-1]]:
q.pop()
q.append(right)
cnt+=r
while q and chargeTimes[q[0]]+(right-left+1)*cnt>budget:
if q[0]==left:
q.popleft()
cnt-=runningCosts[left]
left+=1
res=max(res,right-left+1)
return res
总结
orz