【路飞】算法与数据结构-面试题 17.14. 最小K个数 

105 阅读1分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例 1:

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

提示:

  • 0 <= len(arr) <= 100000
  • 0 <= k <= min(100000, len(arr))

思路

最容易想到的方法是排序,排完序之后取前 k 个数字。由于可以返回任意顺序的结果,快排不用全排完,只要找到第 k 个数字的位置,就可以结束排序。

/**
 * @param {number[]} arr
 * @param {number} k
 * @return {number[]}
 */
var smallestK = function(arr, k) {
    if (k === 0) {
        return []
    }
    let sorted = false
    function quicksort(lo, hi) {
        if (sorted || lo >= hi) {
            return
        }
        let i = lo
        let j = hi
        const num = arr[lo]
        while (i < j) {
            while (i < j && arr[j] >= num) {
                j--
            }
            arr[i] = arr[j]
            while (i < j && arr[i] <= num) {
                i++
            }
            arr[j] = arr[i]
        }
        arr[i] = num
        if (i === k) {
            sorted = true
            return
        }
        quicksort(lo, i - 1)
        quicksort(i + 1, hi)
    }
    quicksort(0, arr.length - 1)
    return arr.slice(0, k)
};