Что я попробовал и что я ожидал hashmap для подсчета частоты каждого элемента. Затем я отсортировал записи, используя collections.sort () , но этот подход работает в O (n log n) , что не является оптимальным. Я исследовал, используя PriorityQueue (MinHeap) или TreeMap , но я борюсь с их правильной реализацией. В частности, я не уверен, как эффективно поддерживать k наиболее частые элементы во время итерации по частоте.
Код: Выделить всё
import java.util.*;
public class KMostFrequent {
public static List topKFrequent(int[] nums, int k) {
Map frequencyMap = new HashMap();
for (int num : nums) {
frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
}
List entryList = new ArrayList(frequencyMap.entrySet());
entryList.sort((a, b) -> b.getValue() - a.getValue()); // Sorting in descending order
List result = new ArrayList();
for (int i = 0; i < k; i++) {
result.add(entryList.get(i).getKey());
}
return result;
}
public static void main(String[] args) {
int[] nums = {1, 1, 1, 2, 2, 3};
int k = 2;
System.out.println(topKFrequent(nums, k)); // Expected Output: [1, 2]
}
}
Шаг сортировки (
Код: Выделить всё
entryList.sort()Кроме того, я искал существование. Решения, но в основном обнаружили подходы к сбору. Sort () , которые не соответствуют желаемой эффективности. Некоторые посты предлагают использовать MinHeap, но я борюсь с поддержанием правильной структуры кучи, итерации по карте.
Подробнее здесь: https://stackoverflow.com/questions/794 ... -framework
Мобильная версия