当前位置: 首页 > news >正文

做护士题的那个网站是什么/互联网哪个行业前景好

做护士题的那个网站是什么,互联网哪个行业前景好,医疗网站设计方案,wordpress首页漂浮#我回归了家人们,我将持续更新,并保证高质量内容# 题目取自LeetCode每日一题2502,大家可自行练习或者验证自己思路 题目 给你一个整数 n ,表示下标从 0 开始的内存数组的大小。所有内存单元开始都是空闲的。 请你设计一个具备以下…

#我回归了家人们,我将持续更新,并保证高质量内容#

题目取自LeetCode每日一题2502,大家可自行练习或者验证自己思路


题目

给你一个整数 n ,表示下标从 0 开始的内存数组的大小。所有内存单元开始都是空闲的。

请你设计一个具备以下功能的内存分配器:

  1. 分配 一块大小为 size 的连续空闲内存单元并赋 id mID 。
  2. 释放 给定 id mID 对应的所有内存单元。

注意:

  • 多个块可以被分配到同一个 mID 。
  • 你必须释放 mID 对应的所有内存单元,即便这些内存单元被分配在不同的块中。

实现 Allocator 类:

  • Allocator(int n) 使用一个大小为 n 的内存数组初始化 Allocator 对象。
  • int allocate(int size, int mID) 找出大小为 size 个连续空闲内存单元且位于  最左侧 的块,分配并赋 id mID 。返回块的第一个下标。如果不存在这样的块,返回 -1 。
  • int freeMemory(int mID) 释放 id mID 对应的所有内存单元。返回释放的内存单元数目。

示例:

输入
["Allocator", "allocate", "allocate", "allocate", "freeMemory", "allocate", "allocate", "allocate", "freeMemory", "allocate", "freeMemory"]
[[10], [1, 1], [1, 2], [1, 3], [2], [3, 4], [1, 1], [1, 1], [1], [10, 2], [7]]
输出
[null, 0, 1, 2, 1, 3, 1, 6, 3, -1, 0]

 代码基础框架

class Allocator {

public:

    Allocator(int n) {

       

    }

   

    int allocate(int size, int mID) {

       

    }

   

    int freeMemory(int mID) {

       

    }

};

/**

 * Your Allocator object will be instantiated and called as such:

 * Allocator* obj = new Allocator(n);

 * int param_1 = obj->allocate(size,mID);

 * int param_2 = obj->freeMemory(mID);

 */


 题目分析

目标:设计一个内存分配器,支持分配和释放操作。分配时需要找到最左侧的连续空闲块,释放时需清除所有指定ID的内存单元。

关键要求

我们需要设计一个内存分配器,支持以下功能:

  1. 分配:找到最左侧的连续 size 个空闲内存单元,分配给 mID,并返回起始下标。

  2. 释放:释放所有 mID 对应的内存单元,返回释放的数量。

解题思路

1. 问题分析
  • 内存表示:用一个数组 arr 表示内存单元,arr[i] 的值表示第 i 个内存单元的状态。

    • arr[i] == 0:空闲。

    • arr[i] > 0:已分配给某个 mID

  • 分配逻辑

    • 需要找到最左侧的连续 size 个空闲单元。

    • 如果找到,将其分配给 mID,并返回起始下标;否则返回 -1

  • 释放逻辑

    • 遍历数组,将所有 mID 对应的单元置为 0,并统计释放的数量。

2. 破题关键
  • 如何找到最左侧的连续空闲块

    • 遍历数组,统计连续空闲单元的数量。

    • 当连续空闲单元数量达到 size 时,记录起始位置并分配。

  • 如何高效释放内存

    • 遍历数组,将所有 mID 对应的单元置为 0,并统计数量。


代码逐行解析

1. 初始化
class Allocator {int[] arr;public Allocator(int n) {arr = new int[n]; // 初始化大小为 n 的内存数组,所有单元初始为 0(空闲)}
}
  • 作用:初始化一个大小为 n 的内存数组,所有单元初始为 0,表示空闲。


2. 分配方法 allocate
public int allocate(int size, int mID) {int cnt = 0; // 计数器,记录当前连续空闲单元的数量for (int i = 0; i < arr.length; i++) {if (arr[i] > 0) { // 当前单元已被分配cnt = 0; // 重置计数器continue;}cnt++; // 当前单元空闲,增加计数器if (cnt == size) { // 找到足够的连续空闲单元Arrays.fill(arr, i - size + 1, i + 1, mID); // 分配内存return i - size + 1; // 返回起始下标}}return -1; // 没有找到足够的连续空闲单元
}
  • 逻辑

    1. 初始化计数器 cnt,用于记录当前连续空闲单元的数量。

    2. 遍历数组 arr

      • 如果当前单元已被分配(arr[i] > 0),重置计数器 cnt = 0

      • 如果当前单元空闲(arr[i] == 0),增加计数器 cnt++

      • 当 cnt == size 时,表示找到足够的连续空闲单元:

        • 使用 Arrays.fill 将这段内存单元赋值为 mID

        • 返回这段内存块的起始下标 i - size + 1

    3. 如果遍历完数组仍未找到足够的连续空闲单元,返回 -1

  • 示例

    • 假设 arr = [0, 0, 0, 0, 0],调用 allocate(2, 1)

      • 找到最左侧的连续 2 个空闲单元,分配为 [1, 1, 0, 0, 0],返回 0


3. 释放方法 freeMemory
public int freeMemory(int mID) {int size = 0; // 计数器,记录释放的内存单元数量for (int i = 0; i < arr.length; i++) {if (arr[i] == mID) { // 当前单元属于 mIDarr[i] = 0; // 释放内存单元size++; // 增加计数器}}return size; // 返回释放的内存单元数量
}
  • 逻辑

    1. 初始化计数器 size,用于记录释放的内存单元数量。

    2. 遍历数组 arr

      • 如果当前单元属于 mIDarr[i] == mID),将其释放(设为 0),并增加计数器 size++

    3. 返回 size,表示释放的内存单元数量。

  • 示例

    • 假设 arr = [1, 1, 0, 2, 2],调用 freeMemory(1)

      • 释放所有 mID = 1 的单元,变为 [0, 0, 0, 2, 2],返回 2


复杂度分析

  1. 分配方法 allocate

    • 时间复杂度:O(n),最坏情况下需要遍历整个数组。

    • 空间复杂度:O(1),只使用了常数空间。

  2. 释放方法 freeMemory

    • 时间复杂度:O(n),需要遍历整个数组。

    • 空间复杂度:O(1),只使用了常数空间。

  • 核心思想:通过数组模拟内存单元,遍历处理分配和释放。

  • 优点:实现简单,逻辑清晰。

  • 缺点:在大规模数据下,时间复杂度较高。

  • 优化方向:可以使用更高效的数据结构(如链表或线段树)来管理空闲块,减少时间复杂度。


代码

class Allocator {int[] arr;public Allocator(int n) {arr = new int[n];}public int allocate(int size, int mID) {int cnt = 0;for(int i = 0; i < arr.length; i++){if(arr[i] > 0){cnt = 0;continue;}cnt++;if(cnt == size){Arrays.fill(arr, i - size + 1, i + 1, mID);return i - size + 1;}}return -1;}public int freeMemory(int mID) {int size = 0;for(int i = 0; i < arr.length; i++){if(arr[i] == mID){arr[i] = 0;size++;}}return size;}
}/*** Your Allocator object will be instantiated and called as such:* Allocator obj = new Allocator(n);* int param_1 = obj.allocate(size,mID);* int param_2 = obj.freeMemory(mID);*/


其余思路代码分享

一、Runtime:28ms

class Allocator {private int n;private int[] memory;public Allocator(int n) {this.n = n;this.memory = new int[n];}public int allocate(int size, int mID) {int count = 0;for (int i = 0; i < n; ++i) {if (memory[i] != 0) {count = 0;} else {++count;if (count == size) {for (int j = i - count + 1; j <= i; ++j) {memory[j] = mID;}return i - count + 1;}}}return -1;}public int freeMemory(int mID) {int count = 0;for (int i = 0; i < n; ++i) {if (memory[i] == mID) {++count;memory[i] = 0;}}return count;}
}

二、Runtime:8ms

class Allocator {int[] arr; // 存放数据, arr[i]到arr[i + len[i] - 1]范围内都是arr[i]数据int[] len; // 存放数据长度, len[i]不等于0才有效, 表示arr[i]数据的长度public Allocator(int n) {this.arr = new int[n]; // 初始化默认都是0this.len = new int[n];this.len[0] = n; // 初始mem[0]数据的长度就是n}public int allocate(int size, int mID) {for (int i = 0; i < arr.length; i += len[i]) {if (arr[i] == 0 && len[i] >= size) {// 如果当前数据是0且范围足够if (i + size < arr.length && arr[i + size] == 0) {// 超过size范围之后还是0,说明当前范围超过size,// 也可以直接用len[i] > size判断,更新0的长度len[i + size] = len[i] - size;}arr[i] = mID;len[i] = size;return i;}}return -1;}public int freeMemory(int mID) {int res = 0;// 先删掉数据for (int i = 0; i < arr.length; i += len[i]) {if (arr[i] == mID) {res += len[i];arr[i] = 0;}}// 删掉后为0的范围和其相邻的本来就是0的范围合并for (int i = 0; i < arr.length; i += len[i]) {if (arr[i] == 0) {int j = i + len[i];while (j < arr.length && arr[j] == 0) {j += len[j];}len[i] = j - i;}}return res;}
}/*** Your Allocator object will be instantiated and called as such:* Allocator obj = new Allocator(n);* int param_1 = obj.allocate(size,mID);* int param_2 = obj.freeMemory(mID);*/

制作不易,感谢你的查阅、关注、评论和点赞

http://www.whsansanxincailiao.cn/news/30728514.html

相关文章:

  • 学校网站建设怎么样/怎样推广自己的app
  • 网站建设 浏览器兼容/企业如何建立网站
  • 辽源市建设局网站/营业推广的方式有哪些
  • 云南网站优化建站/域名注册官网
  • 政府移动门户网站建设意见/seo优化seo外包
  • 做购物网站哪种服务器好/关键词搜索推广排行榜
  • 如何给网站做流量/链接点击量软件
  • wordpress post下载/广东seo
  • 专业做网站排名公司电话/上海网站建设哪家好
  • 火影忍者做网站的超帅图片/seo资料
  • 韩国虚拟空间网站/企业网站的主要类型有
  • 利用网站开发诈骗/网站优化方案
  • 单位网站开发费用进什么科目/全自动推广引流软件免费
  • 长春做网站多少钱/东莞seo排名优化
  • 网站模板怎么做/百度app手机版
  • 河北网站建设及推广/搜狗引擎搜索
  • 聊城做网站公司信息/如何做个网站推广自己产品
  • 采摘园网站建设方案/怎么做网络营销推广
  • wordpress提示php版本低/广东seo推广贵不贵
  • 做爰网站有哪些/关键词制作软件
  • wordpress 引导页/seosem是什么职位
  • 哈尔滨发布信息的网站/电脑系统优化软件十大排名
  • 人妖手术是怎么做的视频网站/seo的形式有哪些
  • 苏州网站开发公司哪里济南兴田德润简介/外贸网站建设案例
  • 专业提供网站建设服务的企业/今日西安头条最新消息
  • 网站运营的主要工作内容/优化教程网站推广排名
  • 仿牌外贸网站建设/哈尔滨网站建设
  • 做的比较炫的网站/就业培训机构有哪些
  • 做购物网站之前做些什么/百度推广费用怎么算
  • 怎样做网站的轮播图片/百度贴吧广告投放价格