|
1 | 1 | import java.util.HashMap; |
2 | 2 | import java.util.Map; |
| 3 | +import java.util.PriorityQueue; |
| 4 | +import java.util.Queue; |
3 | 5 |
|
4 | 6 | class SolutionTopKFrequentElements { |
5 | 7 | public int[] topKFrequent(int[] nums, int k) { |
6 | | - // λΉλμμΌλ‘ kκ° λ°ν |
7 | | - // λΉλ 체ν¬: ν΄μλ§΅μΌλ‘ μΉ΄μ΄νΈ. μκ°λ³΅μ‘λ O(N), 곡κ°λ³΅μ‘λ O(N) |
8 | | - // λΉλμ μ λ ¬: sorting, μκ°λ³΅μ‘λ O(N log N), 곡κ°λ³΅μ‘λ O(N) |
9 | | - // ν©μ°: μκ°λ³΅μ‘λ O(N log N), 곡κ°λ³΅μ‘λ O(N) |
| 8 | + // νμ΄ |
| 9 | + // μκ°λ³΅μ‘λ: O(N log K), 곡κ°λ³΅μ‘λ: O(N) |
10 | 10 |
|
11 | | - // λΉλ μ²΄ν¬ |
12 | | - Map<Integer, Integer> freq = new HashMap<>(); |
13 | | - for (int num : nums) { |
14 | | - freq.put(num, freq.getOrDefault(num, 0) + 1); |
15 | | - } |
| 11 | + // μ«μ λ³ λΉλ λμ μ Map μ΄μ© |
| 12 | + // μκ°λ³΅μ‘λ: O(N), 곡κ°λ³΅μ‘λ: O(N) |
| 13 | + Map<Integer, Integer> count = new HashMap<>(); |
| 14 | + for (int n: nums) { |
| 15 | + count.put(n, count.getOrDefault(n, 0) + 1); |
| 16 | + } |
16 | 17 |
|
17 | | - // λΉλμ μ λ ¬ |
18 | | - return freq.keySet().stream() |
19 | | - .sorted((a, b) -> freq.get(b) - freq.get(a)) |
20 | | - .mapToInt(i -> i) |
21 | | - .limit(k) // λ°°μ΄μμ μμ kκ°λ§ λ°ν |
22 | | - .toArray(); |
| 18 | + Queue<Integer> heap = new PriorityQueue<>((x, y) -> count.get(x) - count.get(y)); |
| 19 | + // κ°μ₯ λΉλ²ν kκ°μ μλ₯Ό λ§λ€κΈ° μν΄ μ°μ μμ νλ₯Ό μ¬μ© |
| 20 | + // μκ°λ³΅μ‘λ: O(N log k), 곡κ°λ³΅μ‘λ: O(N) |
| 21 | + for (int n: count.keySet()) { |
| 22 | + heap.add(n); |
| 23 | + if (heap.size() > k) heap.poll(); // κ°μ₯ λΉλ²ν Kκ°κ° λ§μ‘±λμΌλ λμ΄μ μΆκ°νμ§ μκ³ μ μΈ |
| 24 | + } |
| 25 | + |
| 26 | + // k ~ 0 μμλλ‘ νμμ μμμΌλ‘ λ½μ |
| 27 | + // μκ°λ³΅μ‘λ: O(k log k), 곡κ°λ³΅μ‘λ: O(N) |
| 28 | + int[] result = new int[k]; |
| 29 | + for(int i = k - 1; i >= 0; --i){ |
| 30 | + result[i] = heap.poll(); |
| 31 | + } |
| 32 | + |
| 33 | + return result; |
23 | 34 | } |
24 | 35 | } |
0 commit comments