|
Design a data structure that supports all following operations in?average?O(1)?time. ?
? 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(); ? insert, delete 用hashmap操作,get random用arraylist,map存<val, idx>, idx對(duì)應(yīng)val在list中的索引 insert: 如果hash map中存在val,返回false;如果不存在,先在list末尾添加該元素,再把val及其在list中的坐標(biāo)加入map中 delete: 當(dāng)要?jiǎng)h除元素不是list的末尾元素,為了達(dá)到O(1)操作,先把要?jiǎng)h除的元素和最后一個(gè)元素交換(把要?jiǎng)h除元素索引處的值設(shè)為最后一個(gè)元素的值,并在map中放入該元素在list中的新坐標(biāo)),再刪除list最后一個(gè)元素 getRandom: 直接返回list中隨機(jī)元素即可 class RandomizedSet {
Map<Integer, Integer> map;
List<Integer> list;
Random r = new Random();
/** Initialize your data structure here. */
public RandomizedSet() {
map = new HashMap<>();
list = new ArrayList<>();
}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
public boolean insert(int val) {
if(map.containsKey(val)) {
return false;
}
list.add(val);
map.put(val, list.size() - 1);
return true;
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
public boolean remove(int val) {
if(!map.containsKey(val)) {
return false;
}
int idx = map.get(val);
if(idx < list.size() - 1) {
int last = list.get(list.size() - 1);
list.set(idx, last);
map.put(last, idx);
}
map.remove(val);
list.remove(list.size() - 1);
return true;
}
/** Get a random element from the set. */
public int getRandom() {
return list.get(r.nextInt(list.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();
*/
? 來源:http://www./content-4-99301.html |
|
|