两张哈希表

image.png

  • 有重复的不重复加

image.png

  • 因为有remove行为,那么map里的index就可能会不连续,出现很多洞,那么我getRandom的时候就麻烦了,所以比如用户想remove掉15

image.png
我拿24去填15的洞, 并且继承15的index,(我拿最后一条记录去填洞,可以保证每次index都连续)
image.png

  1. class RandomizedSet {
  2. private HashMap<Integer, Integer> keyIndexMap;
  3. private HashMap<Integer, Integer> indexKeyMap;
  4. private int size;
  5. public RandomizedSet() {
  6. keyIndexMap = new HashMap<>();
  7. indexKeyMap = new HashMap<>();
  8. size = 0;
  9. }
  10. public boolean insert(int val) {
  11. if (!keyIndexMap.containsKey(val)) {
  12. keyIndexMap.put(val, size);
  13. indexKeyMap.put(size++, val);
  14. return true;
  15. }
  16. return false;
  17. }
  18. public boolean remove(int val) {
  19. if (keyIndexMap.containsKey(val)) {
  20. int deleteIndex = keyIndexMap.get(val);
  21. int lastIndex = --size;
  22. int lastKey = indexKeyMap.get(lastIndex);
  23. keyIndexMap.put(lastKey, deleteIndex);
  24. indexKeyMap.put(deleteIndex, lastKey);
  25. keyIndexMap.remove(val);
  26. indexKeyMap.remove(lastIndex);
  27. return true;
  28. }
  29. return false;
  30. }
  31. public int getRandom() {
  32. if (size == 0) {
  33. return -1;
  34. }
  35. int randomIndex = (int) (Math.random() * size);
  36. return indexKeyMap.get(randomIndex);
  37. }
  38. }