實現一個容器,在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;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章