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);
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值