实现一个容器,在O(1)的时间复杂度下实现插入、删除、取随机数(LeetCode380)---C++实现

在这里插入图片描述
思路:

利用hashMap和vector,hashMap中保存key和key对应在vector中的索引,删除时vector只需要调用resize函数即可删除尾端元素(前提是将需要删除的元素和尾部元素交换)。

 class RandomizedSet {
public:
	/** Initialize your data structure here. */
	RandomizedSet() {
		//do nothing
	}

	/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
	bool insert(int val) {
		if (hashMap.find(val) != hashMap.end())
			return false;
		hashMap.insert(make_pair(val, nums.size()));
		nums.push_back(val);
		return true;
	}

	/** Removes a value from the set. Returns true if the set contained the specified element. */
	bool remove(int val) {
		if (hashMap.find(val) == hashMap.end())
			return false;
		int index = hashMap.find(val)->second;
		//这里看index是否在nums的尾部 如果是直接resize,否则 让index 和 num.size()-1交换 再resize
		if (index == nums.size() - 1)
			nums.resize(nums.size() - 1);
		else {
			swap(nums[index], nums[nums.size() - 1]);
			nums.resize(nums.size() - 1);
			//此时还要更新nums[index]在hashMap中的value
			hashMap[nums[index]] = index;
		}
		hashMap.erase(val);
		return true;
	}

	/** Get a random element from the set. */
	int getRandom() {
		if (!nums.size())
			return -1;
		srand(time(NULL));
		int i = rand() % nums.size();
		return nums[i];
	}
	unordered_map<int, int>hashMap;
	vector<int>nums;
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值