[路飞]_LeetCode_剑指 Offer 40. 最小的k个数

148 阅读1分钟

题目

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例 1:

输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]

来源:力扣(LeetCode)leetcode-cn.com/problems/zu…

解题思路

  1. 这道题属于简单级别的题,核心在于对原数组排序,只要能写出排序就能答出这道题
  2. 这里我们用快速排序来答题,因为快速排序时间复杂度表现比较好
  3. 排序后把数组中下标大于k-1的元素pop掉再返回数组

代码实现

var getLeastNumbers = function (arr, k) {
  //将数组排升序
  const ans = quickSort(arr, 0, arr.length - 1)

  //保留k个元素
  while (ans.length > k) {
    ans.pop()
  }

  return ans
};

var quickSort = function (nums, left, right) {
  if (!nums || nums.length < 2) return nums
  if (left < right) {
    const base = partition(nums, left, right)
    quickSort(nums, left, base - 1)
    quickSort(nums, base + 1, right)
  }
  return nums
}

var partition = function (nums, left, right) {
  //从待排序区找一个基准数,把小于这个数的数放左边,大于这个数的数放右边
  let base = right
  let minIndex = left
  for (let i = left; i < right; i++) {
    if (nums[i] <= nums[base]) {
      //当前数小于基数时,把当前数和第一个大数交换位置
      [nums[minIndex], nums[i]] = [nums[i], nums[minIndex]]
      minIndex++
    }
  }

  //基数和第一个大数交换位置
  [nums[minIndex], nums[base]] = [nums[base], nums[minIndex]]

  return minIndex
}

如有错误欢迎指出,欢迎一起讨论!