又到了金九银十的毕业季,突然发现豆包还不错,还能刷题,于是试了一试…
跳转:没想到ai还能刷题
问题描述
# 问题描述
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按任意顺序返回答案。
- 1 <= nums.length <= 10^5
- k 的取值范围是 [1, 数组中不相同的元素的个数]
- 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的
你所设计算法的时间复杂度必须优于 O(n log n) ,其中 n 是数组大小。
**示例 1**
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
**示例 2**
输入: nums = [1], k = 1
输出: [1]
没想到还能帮你优化QAQ
我的解法
import java.util.*;
public class Main {
public static String solution(int[] nums, int k) {
List<Integer> list = new ArrayList<>();
// 先统计次数
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
Integer i = map.get(num);
if (Objects.isNull(i)) {
map.put(num, 1);
} else {
map.put(num, i + 1);
}
}
//存储次数对应的num
int[] bucket = new int[nums.length + 1];
map.forEach((key, value) -> {
bucket[value] = key;
});
for (int i = bucket.length - 1; i > 0; i--) {
if (bucket[i] != 0 && k > 0) {
list.add(bucket[i]);
k--;
if (k == 0) {
break;
}
}
}
return Arrays.toString(list.toArray());
}
public static void main(String[] args) {
// You can add more test cases here
int[] nums1 = {1, 1, 1, 2, 2, 3};
int[] nums2 = {1};
System.out.println(solution(nums1, 2));
System.out.println(solution(nums2, 1));
}
}