- [LeetCode 380] Insert Delete Get
- Leetcode.380.Insert Delete GetRa
- [LeetCode 381] Insert Delete Get
- 381. Insert Delete GetRandom O(1
- SpringMVC中的method
- Leetcode - Insert Delete GetRand
- 【leetcode】Insert Delete GetRando
- LeetCode之Insert Delete GetRandom
- 380. Insert Delete GetRandom O(1
- 380. Insert Delete GetRandom O(1
Design a data structure that supports all following operations in average O(1) time.
-
insert(val):
Inserts an item val to the set if not already present. -
remove(val)
: Removes an item val from the set if present.
-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();
Solution: ArrayList + HashMap
- ArrayList: 用于存放存进来的number
- HashMap: 用于存储每个数字在
ArrayList
中的Index
(HashMap才能达到所有操作为O(1)) -
Insert
: 向ArrayList
尾部加入元素,然后写入HashMap
-
Remove
:- 从
HashMap
中找到remove元素在ArrayList中的Index,然后将其与尾部的元素交换。 - 删除尾部元素,
- 同时更新
HashMap
: 删除remove掉的Key Value Pair
,同时更新尾部元素的Index
(其index变成了被remove掉元素的index)
- 从
class RandomizedSet {
List<Integer> nums;
Map<Integer, Integer> numberVsIndex;
/** Initialize your data structure here. */
public RandomizedSet() {
this.nums = new ArrayList<Integer> ();
this.numberVsIndex = new HashMap<Integer, Integer> ();
}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
public boolean insert(int val) {
if (this.numberVsIndex.getOrDefault (val, -1) != -1) {
return false;
}
this.nums.add (val);
this.numberVsIndex.put (val, nums.size () - 1);
//System.out.println (nums.toString ());
return true;
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
public boolean remove(int val) {
if (this.numberVsIndex.getOrDefault (val, -1) == -1) {
return false;
}
int removeIndex = this.numberVsIndex.get (val);
int lastItem = this.nums.get (this.nums.size () - 1);
this.nums.set (removeIndex, lastItem);
this.numberVsIndex.put (lastItem, removeIndex);
this.nums.remove (this.nums.size () - 1);
this.numberVsIndex.remove (val);
return true;
}
/** Get a random element from the set. */
public int getRandom() {
int result = 0;
Random rand = new Random ();
return this.nums.get (rand.nextInt (this.nums.size ()));
}
}
/**
* Your RandomizedSet object will be instantiated and called as such:
* RandomizedSet obj = new RandomizedSet();
* boolean param_1 = obj.insert(val);
* boolean param_2 = obj.remove(val);
* int param_3 = obj.getRandom();
*/
网友评论