查找最小的 k 个数

给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数
例如数组 [4, 5, 1, 6, 2, 7, 3, 8],则最小的 4 个数字是 [1,2,3,4](任意顺序皆可)
数据范围:0 ≤ k, n ≤ 10000,数组中每个数的大小 0≤ val ≤ 1000
要求:空间复杂度 O(n) ,时间复杂度 O(nlogk)
示例 1:
输入:[4, 5, 1, 6, 2, 7, 3, 8], 4
返回:[1, 2, 3, 4]
说明:返回最小的 4 个数即可,返回 [1, 3, 2, 4] 也可以
示例 2:
输入:[1], 0
返回值:[]
示例 3:
输入:[0, 1, 2, 1, 2], 3
返回值:[0, 1, 1]

function minHeapify(nums: number[], i: number, heapSize: number) {
  const left = 2 * i + 1
  const right = 2 * i + 2
  let minIndex = i

  if (left < heapSize && nums[left] < nums[minIndex]) {
    minIndex = left
  }

  if (right < heapSize && nums[right] < nums[minIndex]) {
    minIndex = right
  }

  if (minIndex != i) {
    ;[nums[i], nums[minIndex]] = [nums[minIndex], nums[i]]
    minHeapify(nums, minIndex, heapSize)
  }
}

function buildMinHeap(nums: number[], heapSize: number) {
  let i = Math.floor((heapSize - 1 - 1) / 2)
  for (i; i >= 0; i--) {
    minHeapify(nums, i, heapSize)
  }
}

export function findMinNums(nums: number[], k: number) {
  if (k < 1) return []
  const n = nums.length
  buildMinHeap(nums, n)
  for (let i = n - 1; i >= n - k; i--) {
    ;[nums[0], nums[i]] = [nums[i], nums[0]]
    minHeapify(nums, 0, i)
  }

  return nums.slice(-k)
}