[LeetCode周赛复盘] 第 83 场双周赛20220723
一、本周周赛总结
- 本来下定决心以后不打双周赛,耐不住群友躁动,还是打了,果然坐牢了。
- 一开始系统崩了不能提交,直到四十多分钟,也不知道排名靠前的人怎么搞得。
- 前三题很简单,第四题思维题完全没思路坐牢到结束,失眠到三点,掉26分。
二、 [Easy] 6128. 最好的扑克手牌
链接: 6128. 最好的扑克手牌
1. 题目描述
2. 思路分析
定级Easy。
按顺序模拟即可,判断最多的那张牌情况。
3. 代码实现
class Solution:
def bestHand(self, ranks: List[int], suits: List[str]) -> str:
cnt_s = Counter(suits)
cnt_r = Counter(ranks)
if cnt_s.most_common(1)[0][1] == 5:
return 'Flush'
if cnt_r.most_common(1)[0][1] >= 3:
return 'Three of a Kind'
if cnt_r.most_common(1)[0][1] >= 2:
return 'Pair'
return 'High Card'
三、[Medium] 6129. 全 0 子数组的数目
链接: 6129. 全 0 子数组的数目
1. 题目描述
2. 思路分析
定级Medium。
- 对连续的0分段,统计每段长度k,这段对答案的贡献是(k+1)*k//2。
- 写麻烦了,其实直接判0累加k即可。
- 一开始公式想成了2^n-1, 这个实际上是子序列的数目。
3. 代码实现
class Solution:
def zeroFilledSubarray(self, nums: List[int]) -> int:
l = -1
r = 0
n = len(nums)
ans = 0
for i,a in enumerate(nums):
if a == 0:
if l == -1:
l = r = i
else:
r = i
else:
if l != -1:
# print(l,r)
# ans += 2**(r - l + 1)-1
ans += (r - l + 1)*(r-l+2)//2
l = -1
if l!=-1:
ans += (r - l + 1)*(r-l+2)//2
return ans
四、[Medium]6130. 设计数字容器系统
链接: 6130. 设计数字容器系统
1. 题目描述
2. 思路分析
定级Medium。
- 比较简单,题意一看先想到两个哈希表存k,v的互相映射。
- 由于要维护v对应每个下标顺序,因此v映射k要用有序集合。
- 数据范围1e5,因此复杂度不能超过nlgn,那么用sortedset即可。
3. 代码实现
class NumberContainers:
def __init__(self):
self.a = defaultdict(int)
from sortedcontainers import SortedSet
self.b = defaultdict(SortedSet)
def change(self, index: int, number: int) -> None:
if index in self.a:
s = self.b[self.a[index]]
s.remove(index)
self.a[index] = number
self.b[number].add(index)
def find(self, number: int) -> int:
if number in self.b and self.b[number]:
return self.b[number][0]
return -1
# Your NumberContainers object will be instantiated and called as such:
# obj = NumberContainers()
# obj.change(index,number)
# param_2 = obj.find(number)
五、[Hard] 6131. 不可能得到的最短骰子序列
1. 题目描述
2. 思路分析
定级Hard。
- 这题坐牢到结束,如果见过这题有应该会比较快的做出来。
- 网上找了解释,按这个思路来说,只需要划分子串即可,保证每个子串都有1-k且最短。
- 没个部分最后一个数一定在这个子串里第一次出现,也只出现一次,因此构造这个‘非子序列’可以取每个串最后一个点,然后最后一个串一定是不足的部分,取个不存在的点。
3. 代码实现
class Solution:
def shortestSequence(self, rolls: List[int], k: int) -> int:
ans = 1
s = set()
for r in rolls:
s.add(r)
if len(s) == k:
ans += 1
s.clear()
return ans