You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.7 KiB
69 lines
1.7 KiB
package class_2022_07_3_week;
|
|
|
|
// 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。
|
|
// 你可以按 任意顺序 返回答案。
|
|
// 要求时间复杂度O(N)
|
|
// 本题测试链接 : https://leetcode.cn/problems/top-k-frequent-elements/
|
|
// 提交时直接提交以下代码,并把主类名改成"Solution", 可以直接通过
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Map.Entry;
|
|
|
|
public class Code03_TopKFrequentElements {
|
|
|
|
public static int[] topKFrequent(int[] nums, int k) {
|
|
HashMap<Integer, Integer> map = new HashMap<>();
|
|
for (int num : nums) {
|
|
map.put(num, map.getOrDefault(num, 0) + 1);
|
|
}
|
|
int i = map.size();
|
|
int[][] arr = new int[i][2];
|
|
for (Entry<Integer, Integer> entry : map.entrySet()) {
|
|
arr[--i][0] = entry.getKey();
|
|
arr[i][1] = entry.getValue();
|
|
}
|
|
moreLess(arr, 0, arr.length - 1, k);
|
|
int[] ans = new int[k];
|
|
for (; i < k; i++) {
|
|
ans[i] = arr[i][0];
|
|
}
|
|
return ans;
|
|
}
|
|
|
|
public static void moreLess(int[][] arr, int l, int r, int k) {
|
|
if (k == r - l + 1) {
|
|
return;
|
|
}
|
|
swap(arr, r, l + (int) (Math.random() * (r - l + 1)));
|
|
int pivot = partition(arr, l, r);
|
|
if (pivot - l == k) {
|
|
return;
|
|
} else if (pivot - l > k) {
|
|
moreLess(arr, l, pivot - 1, k);
|
|
} else {
|
|
moreLess(arr, pivot, r, k - pivot + l);
|
|
}
|
|
}
|
|
|
|
public static int partition(int[][] arr, int l, int r) {
|
|
int left = l - 1;
|
|
int index = l;
|
|
while (index < r) {
|
|
if (arr[index][1] <= arr[r][1]) {
|
|
index++;
|
|
} else {
|
|
swap(arr, ++left, index++);
|
|
}
|
|
}
|
|
swap(arr, ++left, r);
|
|
return left;
|
|
}
|
|
|
|
public static void swap(int[][] arr, int i, int j) {
|
|
int[] tmp = arr[i];
|
|
arr[i] = arr[j];
|
|
arr[j] = tmp;
|
|
}
|
|
|
|
}
|