381. Insert Delete GetRandom O(1) - Duplicates allowed https://www.youtube.com/watch?v=mRTgft9sBhA 这个自己写写,花花讲的思路还行 https://zxi.mytechroad.com/blog/hashtable/leetcode-381-insert-delete-getrandom-o1-duplicates-allowed/ 没通过 class RandomizedCollection { /** Initialize your data structure here. */ class Entry{ public int value; public int index; public Entry(int val, int idx){ value = val; index = idx; } } private HashMap<Integer, List<Integer>> map; private List<Entry> vals; private Random rand; public RandomizedCollection() { map = new HashMap<>(); vals = new ArrayList<>(); rand = new Random(); } /** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */ public boolean insert(int val) { if(!map.containsKey(val)){ map.put(val, new ArrayList<>()); } List<Integer> list = map.get(val); list.add(vals.size()); map.put(val, list); vals.add(new Entry(val, list.size()-1)); return list.size() == 1; } /** Removes a value from the collection. Returns true if the collection contained the specified element. */ public boolean remove(int val) { if(!map.containsKey(val)) return false; // need to get the index of the removing value in the list<entry> List<Integer> list = map.get(val); int size = list.size(); int lastIndex = list.get(size -1); list.remove(size-1); if(list.size() == 0){ map.remove(val); } // get the value from the last slot in the list<entry> int listSize = vals.size(); Entry lastSlot = vals.get(listSize - 1); int lvalue = lastSlot.value; int lindex = lastSlot.index; map.get(lvalue).set(lindex,lastIndex); // swap the removing slot with the last slot vals.set(lastIndex, lastSlot); vals.remove(listSize - 1); return true; } /** Get a random element from the collection. */ public int getRandom() { return vals.get(rand.nextInt(vals.size())).value; } }
原文地址:https://www.cnblogs.com/tobeabetterpig/p/9454900.html
时间: 2024-10-11 21:48:47