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

C语言 | Leetcode C语言题解之第380题O(1)时间插入、删除和获取随机元素

题目:

题解:

#define MAX_NUM_SIZE 10001

typedef struct {
    int key;
    int val;
    UT_hash_handle hh; 
} HashItem;

bool findHash(const HashItem ** obj, int key) {
    HashItem *pEntry = NULL;
    HASH_FIND_INT(*obj, &key, pEntry);
    if (NULL != pEntry) {
        return true;
    }
    return false;
}

int getHash(const HashItem ** obj, int key) {
    HashItem *pEntry = NULL;
    HASH_FIND_INT(*obj, &key, pEntry);
    if (NULL == pEntry) {
        return -1;
    }
    return pEntry->val;
}

void insertHash(HashItem ** obj, int key, int val) {
    HashItem *pEntry = NULL;
    HASH_FIND_INT(*obj, &key, pEntry);
    if (NULL != pEntry) {
        pEntry->val = val;
    } else {
        pEntry = (HashItem *)malloc(sizeof(HashItem));
        pEntry->key = key;
        pEntry->val = val;
        HASH_ADD_INT(*obj, key, pEntry);
    }
}

bool removeHash(HashItem ** obj, int key) {
    HashItem *pEntry = NULL;
    HASH_FIND_INT(*obj, &key, pEntry);
    if (NULL != pEntry) {
        HASH_DEL(*obj, pEntry);  
        free(pEntry); 
    }
    return true;
}

void freeHash(HashItem ** obj) {
    HashItem *curr, *tmp;
    HASH_ITER(hh, *obj, curr, tmp) {
        HASH_DEL(*obj, curr);  
        free(curr);
    }
}

typedef struct {
    int * nums;
    int numsSize;
    HashItem * indices;
} RandomizedSet;

RandomizedSet* randomizedSetCreate() {
    srand((unsigned)time(NULL));
    RandomizedSet * obj = (RandomizedSet *)malloc(sizeof(RandomizedSet));
    obj->nums = (int *)malloc(sizeof(int) * MAX_NUM_SIZE);
    obj->numsSize = 0;
    obj->indices = NULL;
    return obj;
}

bool randomizedSetInsert(RandomizedSet* obj, int val) {
    HashItem *pEntry = NULL;
    if (findHash(&obj->indices, val)) {
        return false;
    }
    int index = obj->numsSize;
    obj->nums[obj->numsSize++] = val;
    insertHash(&obj->indices, val, obj->numsSize - 1);
    return true;
}

bool randomizedSetRemove(RandomizedSet* obj, int val) {
    if (!findHash(&obj->indices, val)) {
        return false;
    }
    int index = getHash(&obj->indices, val);
    int last = obj->nums[obj->numsSize - 1];
    obj->nums[index] = last;
    insertHash(&obj->indices, last, index);
    obj->numsSize--;
    removeHash(&obj->indices, val);
    return true;
}

int randomizedSetGetRandom(RandomizedSet* obj) {
    int randomIndex = rand() % obj->numsSize;
    return obj->nums[randomIndex];
}

void randomizedSetFree(RandomizedSet* obj) {
    freeHash(&obj->indices);
    free(obj->nums);
    free(obj);
}

http://www.kler.cn/a/281498.html

相关文章:

  • 结合element和原生写法<a>标签实现excel文件的下载和上传
  • Python神经网络在基因组学中的应用
  • Qt之界面优化
  • 《引领潮流还是跟随步伐?国产游戏技术的全球影响力深度剖析》
  • 数据结构(一)——顺序表和单向链表(一对一)
  • HC32 华大DMA 传输
  • redis的紧凑列表ziplist、quicklist、listpack
  • Oracle(ORA-00210、ORA-00202)控制文件错误
  • C++:new
  • day_57
  • 【K8s】专题十二(3):Kubernetes 存储之 PersistentVolumeClaim
  • SQL的化身术:使用AS为列或表指定别名
  • Gerapy 分布式爬虫管理框架
  • 智能听诊器:宠物健康的科技守护者
  • SpringMVC基于注解使用:响应处理
  • [Unity] StateMachineBehaviour简单调用MonoBehaviour的方法
  • SSM课程资源库APP—计算机毕业设计源码23834
  • ES6笔记总结(Xmind格式):第三天
  • 微服务入门
  • Spring Cloud + JWT实现双Token刷新