力扣347.前k个高频元素
题目描述:
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例1:
输入:nums = [1,1,1,2,2,3], k = 2
输出:[1,2]
示例2:
输入:nums = [1] , k = 1
输出:[1]
解题所用的数据结构与算法:
HashMap,暴力遍历
解题思路:
题目需要我们返回出现频率前K高的元素(题目默认有解),那么我们就可以先将数组中的不重复的元素拿出来并且记该元素出现一次,再次遍历到重复的元素时就将该元素的出现次数修改(加一),然后我们再取出出现次数从大到小依次的前k位元素即可,由此我们很好想到利用具有映射关系的HashMap来解决。
代码实现
class Solution {
public int[] topKFrequent(int[] nums, int k) {
//定义结果集
int[] res = new int[k];
Map<Integer, Integer> map = new HashMap<>();
//统计数组中各元素出现的次数
for (int num : nums) {
if (map.containsKey(num)) {
map.put(num,map.get(num) + 1);
} else {
map.put(num,1);
}
}
//出现最多元素的出现次数
int maxTimes = 0;
//找出出现次数最多的元素的次数
Set keyset = map.keySet();
for (Object key : keyset) {
if (map.get(key) > maxTimes) {
maxTimes = map.get(key);
}
}
//按照出现的次数从大到小添加到结果数组
while (k > 0) {
for (Object key : keyset) {
if (map.get(key) == maxTimes) {
res[k - 1] = (Integer) key;
k--;
}
}
maxTimes--;
}
return res;
}
}
部分代码分析:
对于一下部分代码(代码思路),其实在很多力扣题目中都会用到,可以看作位一个“小技巧”。
Map<Integer, Integer> map = new HashMap()
for (int num : nums) {
if (map.containsKey(num)) {
map.put(num,map.get(num) + 1);
} else {
map.put(num, 1);
}
}