// TypeScript
function topKFrequent(nums: number[], k: number): number[] {
  const ans: number[] = [];

  const map = new Map<number, number>();

  for (const num of nums) {
    map.set(num, (map.get(num) ?? 0) + 1);
  }

  const arr: number[][] = [];
  for (const [k, v] of map) {
    arr.push([k ,v]);
  }
  arr.sort((a, b) => b[1] - a[1]);

  for (let i = 0; i < k; i++) {
    ans.push(arr[i][0]);
  }

  return ans;
};

function topKFrequent2(nums: number[], k: number): number[] {
  const count = new Map<number, number>();
  for (const num of nums) count.set(num, (count.get(num) ?? 0) + 1);

  const buckets: number[][] = Array(nums.length + 1).fill(null).map(() => []);
  for (const [num, freq] of count) buckets[freq].push(num);

  const ans: number[] = [];
  for (let i = buckets.length - 1; i >= 0 && ans.length < k; i--) {
    for (const num of buckets[i]) {
      ans.push(num);
      if (ans.length === k) {
        break;
      }
    }
  }
  return ans;
};