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