shriyanshi24jindal

Top K Frequent Elements

Mar 30th, 2026
121
0
Never
Not a member of GistPad yet? Sign Up, it unlocks many cool features!
Java 20.88 KB | None | 0 0
  1. class Pair
  2. {
  3. int num;
  4. int freq;
  5. Pair(int freq, int num)
  6. {
  7. this.num = num;
  8. this.freq = freq;
  9. }
  10.  
  11. public int getFreq()
  12. {
  13. return this.freq;
  14. }
  15.  
  16. public int getNumber()
  17. {
  18. return this.num;
  19. }
  20. }
  21.  
  22. class Solution {
  23. /**
  24.   1. Define hashmap to store frequencies of each number present in given array
  25.   2. Since we need to store keys according to highest frequency, sort the map in descending order
  26.   3. convert the map into List<Map>
  27.   4. sort according to frequencies stored in map
  28.   5. convert the sorted list into sorted hashmap by iterating over the sorted list and store ky,value pair in sorted map
  29.   6. iterate over the sorted map and find the top-k frequent elements and store them in array
  30.   7. return that resultant array
  31.   */
  32. // O(n log n) O(n)
  33. public int[] topKFrequent(int[] nums, int k) {
  34. // map : <element, frequency>
  35. Map<Integer, Integer> map = new HashMap<>();
  36. for(int ele : nums)
  37. {
  38. map.put(ele, map.getOrDefault(ele, 0) + 1);
  39. }
  40.  
  41. // sort the map according to frequencies in desc order
  42. // so convert map into list and then sort list
  43. List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
  44. list.sort( (a,b) -> b.getValue().compareTo(a.getValue()));
  45.  
  46. // convert the sorted list into sorted map
  47. Map<Integer, Integer> sortedMap = new LinkedHashMap<>();
  48. for(Map.Entry<Integer, Integer> entry : list)
  49. {
  50. int key = entry.getKey();
  51. int freq = entry.getValue();
  52.  
  53. sortedMap.put(key, freq);
  54. }
  55.  
  56. // fetch the topmost k-keys from sorted map
  57. int index=0,count=0;
  58. int[] arr = new int[k];
  59. for(Map.Entry<Integer,Integer> entry : sortedMap.entrySet())
  60. {
  61. arr[index] = entry.getKey();
  62. index++;
  63. count++;
  64. if(count == k)
  65. break;
  66. }
  67. return arr;
  68. }
  69.  
  70.  
  71. /**
  72.   1. Define hashmap to store frequencies of each number present in given array
  73.   2. Define a min heap that will store <frequency, number> in ascending order
  74.   3. Iterate over a hashmap and insert the pair of <frequency, number> into min-heap
  75.   4. if anytime min-heap size becomes greater than K, pop out elements from heap
  76.   5. Convert the elements stored in min-heap to arraylist and then to array 'res'
  77.   6. return res array.
  78.   */
  79. // O(n log k) O(n)
  80. public int[] topKFrequent(int[] nums, int k) {
  81. // map : <element, frequency>
  82. Map<Integer, Integer> map = new HashMap<>();
  83. for(int ele : nums)
  84. {
  85. map.put(ele, map.getOrDefault(ele, 0) + 1);
  86. }
  87.  
  88. // Min heap to keep top k elements
  89. PriorityQueue<Pair> pq = new PriorityQueue<>((a, b) -> a.getFreq() - b.getFreq());
  90. for(Map.Entry<Integer, Integer> entry : map.entrySet())
  91. {
  92. int freq = entry.getValue();
  93. int key = entry.getKey();
  94. pq.offer(new Pair(freq, key));
  95.  
  96. // remove least frequent element
  97. if(pq.size() > k)
  98. pq.poll();
  99. }
  100.  
  101. ArrayList<Integer> list = new ArrayList<>();
  102. while(!pq.isEmpty())
  103. {
  104. Pair pair = pq.poll();
  105. int ele = pair.num;
  106. list.add(ele);
  107. }
  108.  
  109. int[] res = new int[list.size()];
  110. int l = 0;
  111. for(int ele : list)
  112. {
  113. res[l] = ele;
  114. l++;
  115. }
  116. return res;
  117. OR
  118. return list.stream().mapToInt(Integer::intValue).toArray();
  119. }
  120. }
RAW Paste Data Copied