剑指 Offer II 060. 出现频率最高的 k 个数字
借用map结构将数组转换为map结构,例如 nums = [1,1,1,2,2,3]转换为了map = {1 => 3, 2 => 2, 3 => 1},其中key值代表重复的字符,对应的值为重复的次数,
我们再次将map结构转换为数组结构arr = [3:1,2:2,1:3],默认情况下数组会按照重复的次数排序,我们只需要从后面往前遍历数组即可,遍历期间需要注意,因为数组的key值可能存在断层,断层遍历的值为undefined,于是在内部需要做一下if判断过滤下,还有一点需要注意的是 nums = [1,2],出现重复次数都为1,当k为1了,则需要返回[1,2],这时候我们需要将map结构转换为数组的时候,需要将出现相同次数的值,放在一个数组里面,如 for (var [key, value] of map.entries()) {内部遍历
var topKFrequent = function (nums, k) {
var map = new Map();
for (var i = 0; i < nums.length; i++) {
map.set(nums[i], (map.get(nums[i]) || 0) + 1);
}
var arr = [];
for (var [key, value] of map.entries()) {
if (arr[value]) {
arr[value].push(key);
} else {
arr[value] = [key];
}
}
var len = arr.length;
var res = [];
for (var j = len - 1; j >= 0; j--) {
if (res.length == k) {
return res;
}
if (arr[j]) {
arr[j].forEach((item) => {
res.push(item);
});
}
}
return res;
};