C语言 | Leetcode C语言题解之第381题O(1)时间插入、删除和获取随机元素-允许重复

news2024/9/23 19:18:06

题目:

题解:

#define DYNAMIC_ARRAY_SIZE 128

typedef struct {
    int *data;
    int size, capacity;
} dynamic_array_t;
dynamic_array_t *dynamic_array_init() {
    dynamic_array_t *da = malloc(sizeof(dynamic_array_t));
    da->size = 0, da->capacity = DYNAMIC_ARRAY_SIZE;
    da->data = malloc(da->capacity * sizeof(int));
    return da;
}
void dynamic_array_destroy(dynamic_array_t *da) {
    free(da->data);
    free(da);
}
int dynamic_array_append(dynamic_array_t *da, int val) {
    if (da->size == da->capacity) da->data = realloc(da->data, (da->capacity += DYNAMIC_ARRAY_SIZE) * sizeof(int));
    da->data[da->size] = val;
    return da->size++;
}
int dynamic_array_random(dynamic_array_t *da) {
    return da->data[rand() % da->size];
}
int dynamic_array_pop(dynamic_array_t *da) {
    return da->data[--da->size];
}
int dynamic_array_size(dynamic_array_t *da) {
    return da->size;
}
void dynamic_array_set(dynamic_array_t *da, int index, int val) {
    da->data[index] = val;
}

typedef struct {
    int index;
    UT_hash_handle hh;
} hash_index_t;
void hash_index_add(hash_index_t **t, int val) {
    hash_index_t *index = malloc(sizeof(hash_index_t));
    index->index        = val;
    HASH_ADD_INT(*t, index, index);
}
int hash_index_pop(hash_index_t **t) {
    int ans             = (*t)->index;
    hash_index_t *index = *t;
    HASH_DEL(*t, index);
    free(index);
    return ans;
}
void hash_index_remove(hash_index_t **t, int val) {
    hash_index_t *index = NULL;
    HASH_FIND_INT(*t, &val, index);
    HASH_DEL(*t, index);
    free(index);
}

typedef struct {
    int key;
    hash_index_t *index_hash;
    UT_hash_handle hh;
} hash_t;
hash_t *hash_new(int key, int val) {
    hash_t *h = malloc(sizeof(hash_t));
    h->key = key, h->index_hash = NULL;

    hash_index_add(&h->index_hash, val);
    return h;
}
void hash_destroy(hash_t *h) {
    for (hash_index_t *cur = h->index_hash; cur; cur = h->index_hash) {
        HASH_DEL(h->index_hash, cur);
        free(cur);
    }
    free(h);
}

typedef struct {
    hash_t *hash;
    dynamic_array_t *array;
} RandomizedCollection;

/** Initialize your data structure here. */

RandomizedCollection *randomizedCollectionCreate() {
    RandomizedCollection *collection = malloc(sizeof(RandomizedCollection));

    collection->hash  = NULL;
    collection->array = dynamic_array_init();

    return collection;
}

/** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */
bool randomizedCollectionInsert(RandomizedCollection *collection, int val) {
    hash_t *cur = NULL;

    int index = dynamic_array_append(collection->array, val);
    HASH_FIND_INT(collection->hash, &val, cur);
    if (cur) {
        hash_index_add(&cur->index_hash, index);
        return false;
    } else {
        cur = hash_new(val, index);
        HASH_ADD_INT(collection->hash, key, cur);
        return true;
    }
}

/** Removes a value from the collection. Returns true if the collection contained the specified element. */
bool randomizedCollectionRemove(RandomizedCollection *collection, int val) {
    hash_t *cur = NULL;

    HASH_FIND_INT(collection->hash, &val, cur);
    if (!cur) return false;

    // 获取待移除下标
    int index = hash_index_pop(&cur->index_hash);
    // 获取数组最后一位下标
    int index_remove = dynamic_array_size(collection->array) - 1;
    // 获取数组最后一位数据
    int val_change = dynamic_array_pop(collection->array);

    if (index != index_remove) {
        hash_t *change = NULL;

        // 设置数据新位置
        dynamic_array_set(collection->array, index, val_change);

        // 修改哈希表记录
        HASH_FIND_INT(collection->hash, &val_change, change);
        hash_index_add(&change->index_hash, index);
        hash_index_remove(&change->index_hash, index_remove);
    }

    if (HASH_COUNT(cur->index_hash) == 0) {
        HASH_DEL(collection->hash, cur);
        hash_destroy(cur);
    }

    return true;
}

/** Get a random element from the collection. */
int randomizedCollectionGetRandom(RandomizedCollection *collection) {
    return dynamic_array_random(collection->array);
}

void randomizedCollectionFree(RandomizedCollection *collection) {
    dynamic_array_destroy(collection->array);
    for (hash_t *cur = collection->hash; cur; cur = collection->hash) {
        HASH_DEL(collection->hash, cur);
        hash_destroy(cur);
    }
    free(collection);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2084638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

支付宝开放平台-开发者社区——AI 日报 「8 月 29 日」

1 3分钟千人被裁,IBM中国大败退 量子位|阅读原文 该公司首席执行官 Arvind Krishna早前就表示,公司将在未来五年内,用人工智能取代8000个岗位工作。早在上一轮AI浪潮之初,IBM就已经实现了智能问答系统,成…

基因生物行业大数据中心之间高效数据备份怎么去实现

随着高通量测序技术的迅猛发展,基因数据的积累正以惊人的速度增长。预计到2025年,全球的测序能力将达到Zb的规模。面对海量的数据,传统的数据备份方法已经显得不够用,难以满足跨地区备份和灾难恢复的需求。因此,基因生…

SpringCloudGateway网关技术

一、认识网关 二、网关服务初始化 1、新建网关module、引入依赖 <dependencies><!--common&#xff0c;自己的通用工具类--><dependency><groupId>com.heima</groupId><artifactId>hm-common</artifactId><version>1.0.0<…

亲测好用,ChatGPT 3.5/4.0新手使用手册,最全论文指令手册~ 【2024年9月 更新】

本以为遥遥领先的GPT早就普及了&#xff0c;但小伙伴寻找使用的热度一直高居不下&#xff0c;其实现在很简单了&#xff01; 国产大模型快200家了&#xff0c;还有很多成熟的国内AI产品&#xff0c;跟官网一样使用&#xff0c;还更加好用~ ① 3.5 大多数场景是够用的&#xff…

不良信息公示

系统应用于对各类不良信息进行公示 1、背景 针对目前各类打工人的工作生活&#xff0c;所遇仲裁无门&#xff0c;投诉无果的现象&#xff0c;以及各类公司有恃无恐的态度作为背景&#xff0c;特此对开源项目进行修改&#xff0c;诞生了此套系统 2、系统信息收集 为保障小人…

大模型时代,算法工程师的黄金时代

在大模型时代&#xff0c;算法工程师的角色已经超越了传统的编程和算法优化&#xff0c;他们成为了推动技术革新和业务发展的关键力量。作为一名算法工程师&#xff0c;我深刻地感受到这个时代对我们的新要求和期待。回想起我刚刚踏入这个领域时&#xff0c;深度学习还只是少数…

【多视图聚类】Reconsidering Representation Alignment for Multi-view Clustering

Reconsidering Representation Alignment for Multi-view Clustering CVPR 2021 0.论文摘要和信息 摘要 对齐视图表示的分布是当今用于深度多视图聚类的最先进模型的核心组件。然而&#xff0c;我们发现了nävely对齐表示分布的几个缺点。我们证明了这些缺点既导致表示空间…

07-问题-如何在Python中检查字符串是否为有效的标识符?

问题-如何在Python中检查字符串是否为有效的标识符&#xff1f; 规则 在Python中&#xff0c;标识符用来表示变量、函数、类、模块或其他对象的名字&#xff0c;并且需要遵循以下规则&#xff1a;可以由字母&#xff08;包括大小写&#xff09;、数字和下划线组成。不能以数字…

开放式蓝牙耳机有什么用?四款值得买的高性价比开放式耳机推荐

开放式耳机具有多方面的作用&#xff1a; 佩戴舒适&#xff1a;开放式耳机不入耳&#xff0c;不堵塞耳道&#xff0c;可避免对耳膜造成压迫&#xff0c;长时间佩戴也不会有明显的不适感&#xff0c;像耳挂式或夹耳式设计&#xff0c;还能减少耳部负担&#xff0c;适合需要长时…

什么是IP地址?它有什么用?

IP地址&#xff0c;即互联网协议地址&#xff08;Internet Protocol Address&#xff09;&#xff0c;是互联网上每台设备的数字标识&#xff0c;它如同现实生活中的身份证&#xff0c;确保着网络世界中的每个“居民”都能被准确识别和定位。 IP地址由一串数字组成&#xff0c…

点云数据介绍

本篇内容 通过PCD文件介绍点云数据如何通过PCL库读取和保存PCD点云数据文件 1 点云数据 最简单的点云数据就是一堆三维坐标点&#xff08;x,y,z&#xff09;&#xff0c;除了坐标还可以记录每个点的颜色信息&#xff08;r,g,b&#xff09;&#xff0c;或者强度信息&#xff…

【Asio网络编程】socket的监听和连接

文章目录 一、VS2019配置boost库二、 网络编程基本流程三、 终端节点的创建3.1 客户端终端节点3.2 服务端终端节点 四、 创建SOCKET4.1 客户端创建socket4.2 服务端创建socket4.3 绑定acceptor 五、 连接5.1 客户端连接5.2 客户端通过域名连接(了解即可&#xff0c;用的少)5.2 …

使用 curl_cffi 解决 Web 抓取中的 TLS/JA3 指纹识别方法

在网站抓取过程中遇到反爬虫措施而苦苦挣扎&#xff1f;curl_cffi 是一个高级 Python 库&#xff0c;它包装了 cURL 工具&#xff0c;可以帮助您有效地绕过这些障碍。通过模拟浏览器行为并利用 cURL 的功能&#xff0c;curl_cffi 增强了您的抓取器避免检测并顺利执行的能力。在…

索迪迈科技油罐车监控系统中车载摄像头的布局策略

随着科技的不断发展&#xff0c;车载监控系统在油罐车上的安装已经成为了一种趋势。这不仅大大降低了车辆的安全隐患与运营成本&#xff0c;更对石油运输企业优化资源配置、提高市场竞争力起到了积极的促进作用。那么&#xff0c;在油罐车监控系统中&#xff0c;如何合理布局车…

Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现根据每次触发信号移动感兴趣区域ROI(Python)

Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现根据每次触发信号移动感兴趣区域ROI&#xff08;Python&#xff09; Baumer工业相机Baumer工业相机定序器功能的技术背景Baumer工业相机通过NEOAPI SDK使用定序器功能预期的相机动作测试的图像效果 Baumer工业相机通过NEOAPI S…

LoRA - 大型语言模型的低秩适应方法

人工智能咨询培训老师叶梓 转载标明出处 大规模预训练模型&#xff0c;如GPT-3&#xff0c;拥有高达1750亿参数&#xff0c;全参数微调不仅计算成本高昂&#xff0c;而且部署和维护多个微调实例变得非常困难。而且全参数微调需要大量的GPU内存&#xff0c;限制了同时训练的模型…

go 切片slice学习总结

切片的结构 切片的底层结构&#xff1a; type SliceHeader struct {Data uintptr // 指向底层数组的指针 Len int //长度Cap int //空间容量 } 切片的初始化 1 通过数组或者已有的slice创建新的slice 1.1 使用数组创建切片 通过数组的一部分来初始化切片。 …

fixed、absolute 和 relative 布局

https://andi.cn/page/621716.html

计算机视觉编程 1(图片处理)

目录 灰色度 缩略图 拷贝粘贴区域 调整图像尺寸 旋转图像45 画图线、描点 灰色度 灰度是指图像中每个像素的亮度值&#xff0c;用来描述图像中各个像素的明暗程度。在计算机视觉中&#xff0c;灰度可以通过以下方式来计算&#xff1a; 1. 平均值法&#xff1a;将图像中每…

核心技术揭秘:AI、低代码与定制开发的三重奏,如何应对复杂业务需求

背景介绍 在当今迅速发展的数字化时代&#xff0c;企业面临的业务环境变得日益复杂和多变。无论是面对不断变化的市场需求&#xff0c;还是处理海量数据并从中获取洞察力&#xff0c;企业都需要快速响应并灵活调整自身的策略。传统的开发模式在应对这种复杂性时往往显得力不从心…