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

2015做那些网站能致富移动设备网站开发注意点

2015做那些网站能致富,移动设备网站开发注意点,做网站买空间用共享ip,建设银行人力资源系统网站代码训练(23)LeetCode之随机访问元素 Author: Once Day Date: 2025年6月5日 漫漫长路,才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 380. O(1) 时间插入、删除和获取随机元素 - 力扣(LeetCode)力…

代码训练(23)LeetCode之随机访问元素

Author: Once Day Date: 2025年6月5日

漫漫长路,才刚刚开始…

全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客

参考文章:

  • 380. O(1) 时间插入、删除和获取随机元素 - 力扣(LeetCode)
  • 力扣 (LeetCode) 全球极客挚爱的技术成长平台

文章目录

      • 代码训练(23)LeetCode之随机访问元素
        • 1. 原题
        • 2. 分析
        • 3. 代码实现
        • 4. 总结

1. 原题

实现RandomizedSet 类:

  • RandomizedSet() 初始化 RandomizedSet 对象
  • bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false
  • bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false
  • int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。

你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1)

提示:

  • -231 <= val <= 231 - 1
  • 最多调用 insertremovegetRandom 函数 2 * ``105
  • 在调用 getRandom 方法时,数据结构中 至少存在一个 元素。

示例 1:

输入
["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"]
[[], [1], [2], [2], [], [1], [2], []]
输出
[null, true, false, true, 2, true, false, 2]解释
RandomizedSet randomizedSet = new RandomizedSet();
randomizedSet.insert(1); // 向集合中插入 1 。返回 true 表示 1 被成功地插入。
randomizedSet.remove(2); // 返回 false ,表示集合中不存在 2 。
randomizedSet.insert(2); // 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。
randomizedSet.getRandom(); // getRandom 应随机返回 1 或 2 。
randomizedSet.remove(1); // 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。
randomizedSet.insert(2); // 2 已在集合中,所以返回 false 。
randomizedSet.getRandom(); // 由于 2 是集合中唯一的数字,getRandom 总是返回 2 。
2. 分析

题目要求实现一个 RandomizedSet 类,该类包含以下方法:

  1. RandomizedSet() - 初始化对象。
  2. bool insert(int val) - 插入元素 val,如果元素不存在则插入并返回 true,否则返回 false
  3. bool remove(int val) - 移除元素 val,如果元素存在则移除并返回 true,否则返回 false
  4. int getRandom() - 随机返回集合中的一个元素。保证调用时集合中至少有一个元素,且每个元素有相同的被返回概率。

要求所有操作的平均时间复杂度为 O(1)。

为了满足该题目的要求,我们可以使用哈希表和数组组合的数据结构:

  1. 数组:用于存储元素,支持 O(1) 时间复杂度的随机访问。
  2. 哈希表:键为元素值,值为该元素在数组中的索引,支持 O(1) 时间复杂度的插入和删除操作。

方法实现细节:

插入 (insert):

  • 检查哈希表中是否已存在该元素。如果存在,返回 false
  • 将元素添加到数组末尾,并在哈希表中记录该元素的索引。
  • 返回 true

删除 (remove):

  • 检查哈希表中是否存在该元素。如果不存在,返回 false
  • 从数组中移除该元素,为了维持 O(1) 的复杂度,可以将数组最后一个元素移动到被删除元素的位置,并更新哈希表。
  • 从哈希表中删除该元素,并更新数组的大小。
  • 返回 true

获取随机元素 (getRandom):

  • 从数组中随机选择一个索引,然后返回该索引对应的元素。

性能优化关键点:

  • 内存管理:合理分配和释放内存是关键,尤其是在 randomizedSetCreaterandomizedSetFree 函数中。
  • 哈希冲突:避免哈希冲突可以提升性能,因此选择合适的哈希函数和冲突解决机制很重要。
3. 代码实现
struct entry {int val;int idx;struct entry* next;
};typedef struct {int size;                  // 当前元素数量int array[200000];         // 动态数组存储元素struct entry* map[100000]; // 哈希表存储元素到索引的映射
} RandomizedSet;RandomizedSet* randomizedSetCreate() {RandomizedSet* set = malloc(sizeof(RandomizedSet));memset(set, 0x0, sizeof(RandomizedSet));srand(time(NULL)); // 初始化随机种子return set;
}bool randomizedSetInsert(RandomizedSet* set, int val) {int key = val % 100000;struct entry** prev = &(set->map[key]);struct entry* item = set->map[key];while (item != NULL) {if (item->val == val) {return false;}prev = &(item->next);item = item->next;}item = malloc(sizeof(struct entry));item->val = val;item->next = NULL;item->idx = set->size;*prev = item;set->array[set->size] = val;set->size++;return true;
}bool randomizedSetRemove(RandomizedSet* set, int val) {int key = val % 100000;struct entry** prev = &(set->map[key]);struct entry* item = set->map[key];while (item != NULL) {if (item->val == val) {break;}prev = &(item->next);item = item->next;}if (item == NULL) {return false;}*prev = item->next;int idx = item->idx;free(item);if (idx == set->size - 1) {set->size--;return true;}int lastElement = set->array[set->size - 1];set->array[idx] = lastElement; // 将最后一个元素移动到被删除元素的位置set->size--;key = lastElement % 100000;item = set->map[key];while (item != NULL) {if (item->val == lastElement) {break;}item = item->next;}item->idx = idx;return true;
}int randomizedSetGetRandom(RandomizedSet* set) {int randomIndex = rand() % set->size;return set->array[randomIndex];
}void randomizedSetFree(RandomizedSet* set) {for (int i = 0; i < 100000; i++) {struct entry* item = set->map[i];while (item != NULL) {struct entry* temp = item->next;free(item);item = temp;}}free(set);
}

这段代码实现了一个 RandomizedSet 结构,它支持插入、删除、随机访问和销毁操作。下面分析每部分代码的功能和设计逻辑。

使用了两种数据结构:

  • 数组 (array):用于存储元素值,支持快速通过索引访问和随机访问。
  • 哈希表 (map):链地址法解决哈希冲突的哈希表,存储键为元素值,值为该元素在数组中的索引。

分配内存并初始化 RandomizedSet,其中 memset 用于初始化内存区域。

插入操作首先计算哈希键值,然后遍历链表检查元素是否已存在。如果不存在,创建新条目并加入链表和数组。

删除操作查找链表中的元素,然后从链表和数组中删除,同时更新相关元素的索引。

通过随机生成索引来从数组中获取元素。

释放哈希表中所有链表的内存以及 RandomizedSet 结构的内存。

4. 总结

这个题目主要考察数据结构的灵活应用和操作的优化。通过综合利用数组和哈希表,我们能够实现各种操作的平均 O(1) 时间复杂度。对于提升编程能力,重点是掌握各种数据结构的特点及其适用场景,以及如何根据需求选择和设计最合适的数据结构。

表和数组中删除,同时更新相关元素的索引。

通过随机生成索引来从数组中获取元素。

释放哈希表中所有链表的内存以及 RandomizedSet 结构的内存。

http://www.dtcms.com/a/492495.html

相关文章:

  • 模板下载网站织梦模板wordpress 内容格式
  • 网站一条龙服务模板和网站的区别
  • 企业网站备案名称西安网站建设制作价格
  • 网站建设和网络搭建是一回事吗巴中自助网站建设
  • codetop高频(2)
  • 网站建设的客户在哪里大学生网页设计期末作业
  • 利用RPA技术,重塑企业核心业务流程
  • Qwen3 Embedding报告随笔
  • 做网站的公司有哪些岗位做网站怎么接广告赚钱
  • HTML列表、表格和表单
  • 软件发布网站源码百度只更新快照不收录网站
  • 郑州营销网站建设公司网站建设的目的
  • 资兴市网站建设哪个好页面设计培训多少钱
  • 哪种语言做的网站好专业seo服务
  • 推广网站怎么做知乎咸阳seo优化
  • 模具加工东莞网站建设技术支持阿里云电影网站建设教程
  • 建设部网站投诉核查企业名单江西省工程造价信息网官网
  • pkg-config 使用指南(简化C++库的编译和链接过程,判断库是否存在及版本)
  • 移动端网站模板怎么做服装网站建设公司有哪些
  • 秦皇岛seo网站推广营销系统平台
  • 游戏平台网站建设推广营销软件
  • LangChain HelloWorld
  • 重庆小程序开发哪家好网站优化具体是怎么做的
  • [嵌入式系统-123]:中高端图形处理器RM Mali-G610 MP4 GPU 是 ARM 公司推出的基于 Valhall 架构 的移动 GPU
  • 广西玉林建设厅官方网站html网页制作视频教学
  • 网站制作公司报价广东省建设厅官方网(官网)
  • 新吴区推荐做网站价格网站字体规范
  • 自动化运维新时代:智能调度与监控让集成更简单
  • Fiddler 2:Fiddler 抓包工具使用;配置支持HTTPS抓包;抓特定请求的包;如何快速抓取想要的包;抓包信息解析
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析11