题目

类型:设计

image.png

解题思路

自定义节点并手写双链表来实现
https://leetcode-cn.com/problems/all-oone-data-structure/solution/by-ac_oier-t26d/

代码

  1. class AllOne {
  2. class Node {
  3. int cnt;
  4. Set<String> set = new HashSet<>();
  5. Node left, right;
  6. Node(int _cnt) {
  7. cnt = _cnt;
  8. }
  9. }
  10. Node hh, tt;
  11. Map<String, Node> map = new HashMap<>();
  12. public AllOne() {
  13. hh = new Node(-1000); tt = new Node(-1000);
  14. hh.right = tt; tt.left = hh;
  15. }
  16. void clear(Node node) {
  17. if (node.set.size() == 0) {
  18. node.left.right = node.right;
  19. node.right.left = node.left;
  20. }
  21. }
  22. public void inc(String key) {
  23. if (map.containsKey(key)) {
  24. Node node = map.get(key);
  25. node.set.remove(key);
  26. int cnt = node.cnt;
  27. Node next = null;
  28. if (node.right.cnt == cnt + 1) {
  29. next = node.right;
  30. } else {
  31. next = new Node(cnt + 1);
  32. next.right = node.right;
  33. next.left = node;
  34. node.right.left = next;
  35. node.right = next;
  36. }
  37. next.set.add(key);
  38. map.put(key, next);
  39. clear(node);
  40. } else {
  41. Node node = null;
  42. if (hh.right.cnt == 1) {
  43. node = hh.right;
  44. } else {
  45. node = new Node(1);
  46. node.right = hh.right;
  47. node.left = hh;
  48. hh.right.left = node;
  49. hh.right = node;
  50. }
  51. node.set.add(key);
  52. map.put(key, node);
  53. }
  54. }
  55. public void dec(String key) {
  56. Node node = map.get(key);
  57. node.set.remove(key);
  58. int cnt = node.cnt;
  59. if (cnt == 1) {
  60. map.remove(key);
  61. } else {
  62. Node prev = null;
  63. if (node.left.cnt == cnt - 1) {
  64. prev = node.left;
  65. } else {
  66. prev = new Node(cnt - 1);
  67. prev.right = node;
  68. prev.left = node.left;
  69. node.left.right = prev;
  70. node.left = prev;
  71. }
  72. prev.set.add(key);
  73. map.put(key, prev);
  74. }
  75. clear(node);
  76. }
  77. public String getMaxKey() {
  78. Node node = tt.left;
  79. for (String str : node.set) return str;
  80. return "";
  81. }
  82. public String getMinKey() {
  83. Node node = hh.right;
  84. for (String str : node.set) return str;
  85. return "";
  86. }
  87. }
  88. /**
  89. * Your AllOne object will be instantiated and called as such:
  90. * AllOne obj = new AllOne();
  91. * obj.inc(key);
  92. * obj.dec(key);
  93. * String param_3 = obj.getMaxKey();
  94. * String param_4 = obj.getMinKey();
  95. */