实现一个容器,在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;
};

猜你喜欢

转载自blog.csdn.net/qq_42673507/article/details/90633708