剑指 Offer II 060. 出现频率最高的 k 个数字

324 阅读1分钟

剑指 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;
};