380. Insert Delete GetRandom O(1)

380. Insert Delete GetRandom O(1)arrow-up-right

Design a data structure that supports all following operations in average O(1) time.

  1. insert(val): Inserts an item val to the set if not already present.

  2. remove(val): Removes an item val from the set if present.

  3. getRandom: Returns a random element from current set of elements. Each element must have the same probability of being returned.

Example:

// Init an empty set.
RandomizedSet randomSet = new RandomizedSet();

// Inserts 1 to the set. Returns true as 1 was inserted successfully.
randomSet.insert(1);

// Returns false as 2 does not exist in the set.
randomSet.remove(2);

// Inserts 2 to the set, returns true. Set now contains [1,2].
randomSet.insert(2);

// getRandom should return either 1 or 2 randomly.
randomSet.getRandom();

// Removes 1 from the set, returns true. Set now contains [2].
randomSet.remove(1);

// 2 was already in the set, so return false.
randomSet.insert(2);

// Since 2 is the only number in the set, getRandom always return 2.
randomSet.getRandom();

My Solutions:

题目要求在O(1)的时间内完成插入, 删除, 取随机元素。

  • 用linked lilst保存元素可以在O(1)内完成插入和删除, 但是无法在O(1)随机元素。

  • 用数组可以在O(1)内完成插入和随机, 但是删除无法在O(1)完成。

如果用另外一种删除方式, 即把要删除的元素与最后的元素交换位置, 而删除最后一个元素就可以在O(1)完成。这样的话需要一个hash表来记录元素在数组的位置, 这样才可以O(1)取到这个元素, 并移动到尾部。还需要注意的是在删除一个元素的时候与另外一个元素交换了位置, 所以在hash表中还需要将另外一个元素的位置更新。由于哈希表的新增/删除操作是O(1),而数组的随机访问操作开销也是O(1),因此满足题设要求

用hashmap和list同时储存value和index。Use hashmap<int, int> set for insert and getRandom to store value and index; Use list的自带index位置储存value,list.get(index)可以达到O(1) 的insert和getRandom

难点是如何让remove也是O(1) - Use list<int> for remove[O(1)]: Always add the element to the end of the list, so when you need to remove a value, swap last element with the want-to-delete element:

1. find the last elem;

2. set last element to be at index position;

3. put last element in index position

Last updated