力扣提升第一天
题目链接:https://leetcode.cn/problems/design-memory-allocator/?envType=daily-question&envId=2025-02-25
一开始解题思路
暴力解决法
我奔着先从简单的写法做起,之后再想办法进行改进,心里已经预料到会出现超出时间限制的报错。
class Allocator:
def __init__(self, n: int):
self.capacity = [0]*n
self.size = n
def allocate(self, size: int, mID: int) -> int:
cur = 0
while cur + size <= self.size:
#检查当前窗口内是否全部可用
if all(self.capacity[cur+i]==0 for i in range(size)):
for i in range(size):
self.capacity[cur + i] = mID
return cur
else:
cur += 1
return -1
def freeMemory(self, mID: int) -> int:
count = 0
for i in range(self.size):
if self.capacity[i] == mID:
self.capacity[i] = 0
count = count + 1
return count
毫无疑问,一脚就被力扣踢死了,出现超时报错(┭┮﹏┭┮)。
开始改进
分析哪些地方最为繁重
- 经过分析,主要集中在
allocate
函数中,循环太多浪费时间
尝试改进方案
- 想不出来(doge
- 查看官方题解(模拟),恍然大悟
class Allocator:
def __init__(self, n: int):
self.n = n
self.memory = [0] * n
def allocate(self, size: int, mID: int) -> int:
count = 0
for i in range(self.n):
if self.memory[i]:
count = 0
else:
count += 1
if count == size:
for j in range(i - count + 1, i + 1):
self.memory[j] = mID
return i - count + 1
return -1
def freeMemory(self, mID: int) -> int:
count = 0
for i in range(self.n):
if self.memory[i] == mID:
count += 1
self.memory[i] = 0
return count
复杂度分析
- 我的写法:由于每次发现当前窗口不是0时都得重新开始遍历一遍size,所以时间复杂度是O(n*size),空间复杂度为O(1)
- 官方写法:遍历一遍数组,发现满足size个空位才开始分配内容,所以时间复杂度是O(n),空间复杂度为O(1)
感悟
- 哈哈哈,还是思考得不到位呢!((:з」∠),居然没想到这么简单的方法,揪着字典啥的方向去思考如何降低时间复杂度了。
- 就这样吧,今天也算是打开完毕了。共勉,继续加油