N
时效率低下的时间。我正在寻找一种更优化的方法。 我尝试了什么以及我的期望: i首先使用hashmap
来计算每个元素的频率。然后,我使用collections.sort()对条目进行了排序,但是此方法在o(n log n)时间中运行,这不是最佳的。我使用Priorityqueue(Minheap)或Treemap
进行了探索,但我正在努力正确实施它们。具体而言,我不确定如何在频率图上迭代时如何有效地维护k个最频繁的元素。我尝试的是什么(代码):
import java.util.*;
public class KMostFrequent {
public static List<Integer> topKFrequent(int[] nums, int k) {
Map<Integer, Integer> frequencyMap = new HashMap<>();
for (int num : nums) {
frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
}
List<Map.Entry<Integer, Integer>> entryList = new ArrayList<>(frequencyMap.entrySet());
entryList.sort((a, b) -> b.getValue() - a.getValue()); // Sorting in descending order
List<Integer> 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()
)采用o(n log n)
N
minheap(Priorityqueue)或treemap
可以提高性能。
从事,我已经搜索了现有的解决方案,但主要是基于Collections.sort()
import java.util.*;
public class KMostFrequent {
public static List<Integer> topKFrequent(int[] nums, int k) {
// Step 1: Count the frequency of each element
Map<Integer, Integer> frequencyMap = new HashMap<>();
for (int num : nums) {`enter code here`
frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
}
// Step 2: Use a MinHeap (PriorityQueue) to keep the top K elements
PriorityQueue<Map.Entry<Integer, Integer>> minHeap = new PriorityQueue<>(
Comparator.comparingInt(Map.Entry::getValue) // MinHeap based on frequency
);
// Step 3: Iterate over the frequency map and maintain only the top K elements
for (Map.Entry<Integer, Integer> entry : frequencyMap.entrySet()) {
minHeap.offer(entry);
if (minHeap.size() > k) {
minHeap.poll(); // Remove the least frequent element
}
}
// Step 4: Extract elements from the MinHeap
List<Integer> result = new ArrayList<>();
while (!minHeap.isEmpty()) {
result.add(minHeap.poll().getKey());
}
Collections.reverse(result); // Optional: to maintain descending order of frequency
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]
}
}