🌻算法,不如说它是一种思考方式🍀
算法专栏: 👉🏻123
一、🌱347. 前 K 个高频元素
- 题目描述:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
- 来源:力扣(LeetCode)
- 难度:中等
- 提示:
1 <= nums.length <= 105
k 的取值范围是 [1, 数组中不相同的元素的个数]
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的 -
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
🌴解题
HashMap查找
使用 HashMap 来统计出数组中数字出现的次数,然后得到 HashMap 的值 value 并按大小排序。选取前 k 值到 HashMap 中找出 key 即可。
由于排序算法没有进行处理,时间复杂度仍然过高。可以使用修改的快速排序,只需要找到 k 就可以确定前 k 大的 value。👉🏻参考 LeetCode:215. 数组中的第K个最大元素 ,使用快速排序思想简化问题。
- code:
class Solution {
public int[] topKFrequent(int[] nums, int k) {
int[] ans = new int[k];
HashMap<Integer, Integer> map=new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if(map.containsKey(nums[i])){
map.put(nums[i], map.get(nums[i]) + 1);
}
else
map.put(nums[i], 1);
}
int n=map.size();
Integer[] mapv=map.values().toArray(new Integer[n]); //将值进行排序,得到前k
Arrays.sort(mapv, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
for (Map.Entry<Integer, Integer> integerIntegerEntry : map.entrySet()) {
for (int i = 0; i < k; i++) { //找对应的key
if (integerIntegerEntry.getValue() == mapv[i] && ans[i]==0) {
ans[i]= integerIntegerEntry.getKey();
break;
}
}
}
return ans;
}
}
☕物有本末,事有终始,知所先后。🍭
🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓