LeetCode 432. 全 O(1) 的数据结构
题目链接:
【分析】能力不够,只能用TreeMap来做了,TreeMap的键存元素的出现次数,值为一个Set存出现了这些次的字符串,再用一个HashMap来进行String到出现次数的映射,插入和删除的时候先去查HashMap,再修改TreeMap。
class AllOne { Map<String, Integer> map = new HashMap<>(); TreeMap<Integer, Set<String>> freq = new TreeMap<>(); public AllOne() { } public void show(){ int i; for(Integer it: freq.keySet()){ System.out.print(it); System.out.print(" "); } System.out.println(" *****"); } public void inc(String key) { if(!map.containsKey(key)){ map.put(key, 1); if(!freq.containsKey(1)){ Set<String> set = new HashSet<>(); set.add(key); freq.put(1, set); }else{ freq.get(1).add(key); } }else{ int val = map.get(key); map.put(key, val + 1); freq.get(val).remove(key); if(freq.get(val).size() == 0) freq.remove(val); if(!freq.containsKey(val + 1)){ Set<String> set = new HashSet<>(); set.add(key); freq.put(val + 1, set); }else{ freq.get(val + 1).add(key); } } // show(); } public void dec(String key) { int val = map.get(key); if(val == 1){ map.remove(key); freq.get(val).remove(key); if(freq.get(val).size() == 0) freq.remove(val); }else{ map.put(key, map.get(key) - 1); freq.get(val).remove(key); if(freq.get(val).size() == 0) freq.remove(val); if(!freq.containsKey(val - 1)){ HashSet<String> set = new HashSet<>(); set.add(key); freq.put(val - 1, set); }else{ freq.get(val - 1).add(key); } } // show(); } public String getMaxKey() { if(freq.size() == 0) return ""; Set<String> set = freq.get(freq.lastKey()); return (String)set.toArray()[0]; } public String getMinKey() { if(freq.size() == 0) return ""; Set<String> set = freq.get(freq.firstKey()); return (String)set.toArray()[0]; } }
上一篇:
IDEA上Java项目控制台中文乱码