力扣提升第一天

力扣提升第一天

题目链接: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)

感悟

  • 哈哈哈,还是思考得不到位呢!((:з」∠),居然没想到这么简单的方法,揪着字典啥的方向去思考如何降低时间复杂度了。
  • 就这样吧,今天也算是打开完毕了。共勉,继续加油
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不吃牛肉!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值