第一题是设计题本来打算放到最后做的,结果第三题死活没过,所以最后的得分和排名都很低(还是太菜了)
5601. 设计有序流(3分,通过率:2402/3184)
class OrderedStream:
def __init__(self, n: int):
self.n = n
self.ptr = 1
self.List = [ 0 for i in range(n+1)]
def insert(self, id: int, value: str) -> List[str]:
self.List[id] = value
ans = []
if self.ptr == id :
while self.ptr <= self.n and self.List[self.ptr] != 0 :
ans.append(self.List[self.ptr])
self.ptr += 1
return ans
else:
return []
5603. 确定两个字符串是否接近(4分,通过率:2078/4952)
思路:①如果两个字符有同样的出现字符
②出现的次数对应相等
③满足以上两个条件时返回True,否则返回False
class Solution:
def closeStrings(self, word1: str, word2: str) -> bool:
c1 = collections.Counter(word1)
c2 = collections.Counter(word2)
l1 = list(c1.values())
l2 = list(c2.values())
l1.sort()
l2.sort()
s1 = set(word1)
s2 = set(word2)
return l1 == l2 and s1 == s2
5602. 将 x 减到 0 的最小操作数(5分,通过率:871/6035)
尝试着使用搜索回溯做,但是会超时
尝试使用前缀和+哈希减少回溯深度,仍超时
class Solution:
def minOperations(self, nums: List[int], x: int) -> int:
len_ = len(nums)
l,r = {},{}
cl,cr = 0,0
for i in range(len_):
cl += nums[i]
if cl <= x:
l[cl] = i+1
else:
break
for i in range(len_-1,-1,-1):
cr += nums[i]
if cr <= x:
r[cr] = len_-i
else:
break
在题解里看到一个大佬的思路,和我第二个思路相似,但是他将哈希表的key和value倒了一下,这样节省了很多查询的时间
class Solution:
def minOperations(self, nums: List[int], x: int) -> int:
len_ = len(nums)
l,r = {},{}
cl,cr = 0,0
for i in range(len_):
cl += nums[i]
if cl <= x:
l[cl] = i+1
else:
break
for i in range(len_-1,-1,-1):
cr += nums[i]
if cr <= x:
r[cr] = len_-i
else:
break
min_ = float('inf')
if x in l:
min_ = min(min_,l[x])
if x in r:
min_ = min(min_,r[x])
for l_ in l:
if x-l_ in r:
min_ = min(min_,l[l_]+r[x-l_])
return -1 if min_ > len_ else min_
5604. 最大化网格幸福感(6分,通过率:57/576)
最后一题我放弃了…太难了