https://leetcode.com/problems/top-k-frequent-elements/description/
코드설명
아이디어(Idea) + 해시맵(HashMap) + 우선순위큐(PriorityQueue) 을 활용합니다.
방법은,
1. HashMap으로 각 숫자별 Frequency를 구합니다.
2. 각 Frequency별로 정렬을 하거나 배열을 활용하여서 값을 만들고 Frequency가 높은순서대로 k개 뽑습니다. (배열 활용시 nums.length개의 빈도수만 가능하다는 점을 활용합니다.)
코드
정답코드1입니다.
class Solution { public int[] topKFrequent(int[] nums, int k) { HashMap<Integer, Integer> hashmap = new HashMap<>(); for(int v : nums){ hashmap.put(v, hashmap.getOrDefault(v, 0) + 1); } List<Integer>[] list = new ArrayList[nums.length + 1]; for(int i=0; i<=nums.length; i++){ list[i] = new ArrayList<Integer>(); } for(Map.Entry<Integer, Integer> entrySet : hashmap.entrySet()){ list[entrySet.getValue()].add(entrySet.getKey()); } int[] answer = new int[k]; int idx = 0; for(int i=nums.length; i>=0; i--){ List<Integer> connected = list[i]; for(int j=0; j<connected.size(); j++){ answer[idx++] = connected.get(j); if(idx == k) return answer; } } return answer; } }
PriorityQueue와 Comparator를 활용한 정답코드2입니다.
class Solution { public int[] topKFrequent(int[] nums, int k) { HashMap<Integer, Integer> hashmap = new HashMap<>(); for(int i=0; i<nums.length; i++){ hashmap.put(nums[i], hashmap.getOrDefault(nums[i], 0) + 1); } PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>(){ @Override public int compare(Integer a, Integer b){ return Integer.compare(hashmap.get(b), hashmap.get(a)); } }); for(Map.Entry<Integer, Integer> entrySet : hashmap.entrySet()){ pq.offer(entrySet.getKey()); } int[] answer = new int[k]; int idx = 0; for(int i=0; i<k; i++){ answer[idx++] = pq.poll(); } return answer; } }