/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
const topKFrequent = (nums, k) => {
  if (k < 1) return [];

  let map = new Map(), kList = Array.from({ length: nums.length + 1 }, () => []);

  for (let i = 0; i < nums.length; i++) {
    map.set(nums[i], (map.get(nums[i]) || 0) + 1)
  }

  for (let [key, value] of map) {
    kList[value].push(key);
  }

  let result = [], tmpK = k;
  while (tmpK > 0) {
    let curr = kList.pop();
    if (0 < curr.length) {
      result.push(curr);
      tmpK -= curr.length;
    }
  }

  return result.flat().slice(0, k);
}