昨天的双周赛做的一塌糊涂,今早一醒来思路全出来了,然后这周的周赛做的也还好
5661. 替换隐藏数字得到的最晚时间(3分,通过率:2885/7650)
给你一个字符串 time ,格式为 hh:mm(小时:分钟),其中某几位数字被隐藏(用 ? 表示)。
有效的时间为 00:00 到 23:59 之间的所有时间,包括 00:00 和 23:59 。
替换 time 中隐藏的数字,返回你可以得到的最晚有效时间。
分类讨论即可,要注意的是隐藏数字的位置与取得的最大数有关
class Solution:
def maximumTime(self, time: str) -> str:
ans = ""
##第一位数字
if time[0]!="?":
ans += time[0]
else:
if time[1]!='?' and time[1]>'3':
ans +='1'
else:
ans +='2'
##第二位数字
if time[1]!="?":
ans += time[1]
else:
if ans[0]=="2":
ans += "3"
else:
ans += "9"
#分隔符
ans += ":"
##第三位数字
ans += "5" if time[3]=="?" else time[3]
##第四位数字
ans += "9" if time[4]=="?" else time[4]
return ans
5662. 满足三条件之一需改变的最少字符数(4分,通过率:710/5038)
给你两个字符串 a 和 b ,二者均由小写字母组成。一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 。
操作的最终目标是满足下列三个条件 之一 :
①.a 中的 每个字母 在字母表中 严格小于 b 中的 每个字母 。
②.b 中的 每个字母 在字母表中 严格小于 a 中的 每个字母 。
③.和 b 都 由 同一个 字母组成。
返回达成目标所需的 最少 操作数。
思路:模拟,找基准;将a,b的字母频率统计到数组中,并想象以某个基准为例,a的字母频率在基准以左的变为0,b的字母频率在基准以右的变为0,或相反,即可满足条件1 or 条件2,而统计两者频率之和,取最大数,即可处理得到条件3
以leetcode题解中一图为例:
a,b间的那条线即为基准,这个基准不断右移统计条件1、2即可
class Solution:
def minCharacters(self, a: str, b: str) -> int:
cnta,cntb =[0]*26,[0]*26
cntsum = [0]*26
lena,lenb=len(a),len(b)
for i in a:
cnta[ord(i)-97]+=1
cntsum[ord(i)-97]+=1
for j in b:
cntb[ord(j)-97]+=1
cntsum[ord(j)-97]+=1
ans3 = lena+lenb-max(cntsum)
ans = ans3
for i in range(1,26):
ans1 = sum(cnta[:i])+sum(cntb[i:])
ans2 = sum(cntb[:i])+sum(cnta[i:])
ans = min(ans1,ans2,ans)
return ans
时间复杂度O(n+m+26)
5663. 找出第 K 大的异或坐标值(5分,通过率:1395/2516)
给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n 由非负整数组成。
矩阵中坐标 (a, b) 的 值 可由对所有满足 0 <= i <= a < m 且 0 <= j <= b < n 的元素 matrix[i][j](下标从 0 开始计数)执行异或运算得到。
请你找出 matrix 的所有坐标中第 k 大的值(k 的值从 1 开始计数)。
使用dp数组统计得出每个位置的值,排序取第k大
class Solution:
def kthLargestValue(self, matrix: List[List[int]], k: int) -> int:
m,n = len(matrix),len(matrix[0])
dp = matrix
for i in range(1,n):
dp[0][i] ^= dp[0][i-1]
for j in range(1,m):
dp[j][0] ^= dp[j-1][0]
for j in range(1,m):
for i in range(1,n):
dp[j][i] ^= (dp[j-1][i]^dp[j-1][i-1]^dp[j][i-1])
ans= []
for i in range(m):
ans += dp[i][:]
ans.sort(reverse=True)
return ans[k-1]
时间复杂度O(nm log (mn))
5664. 放置盒子(6分,通过率:338/1166)
感觉像是小学奥数题,找规律
思路:先定层高再定底数
先找到n所对应的最大层高,这里可以使用求和公式实现给出
1k+2(k-1)+3*(k-2) + ··· + k1 = (k(k+1)*(k+2))//6
然后看底层,底层增加1块,上层可加0块
底层增加2块,上层可加1块
底层增加3块,上层可加2+1块
同理
底层增加n块,上层可增加n-1+n-2+···+1块
使用求和公式再次判断位置即可
class Solution:
def minimumBoxes(self, n: int) -> int:
def f(n):
return (n*(n+1)*(n+2))//6
cnt = [f(i) for i in range(0,1820)]
pile = 0
while(cnt[pile]<=n):
pile += 1
pile = pile-1 #层数
ans = (pile+1)*pile//2
n -= cnt[pile]
i = 0
while(True):
if (n<=(i+1)*i//2):
break
else:
i += 1
return ans+i