40.最小的k个数

题目

输入整数数组 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]

示例 2:

输入:arr = [0,1,2,1], k = 1
输出:[0]

限制:

0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一、 暴力解法

先排序,然后直接取。

func getLeastNumbers(_ arr: [Int], _ k: Int) -> [Int] {
    if k == 0 { return [] }
    if arr.count <= k { return arr }
    let rearr: [Int] = arr.sorted { $0 <= $1 }
    return Array(rearr[0...k-1])
}
暴力解法

作为优秀的程序员,虽然可以这么解,但是不应该。虽然从结果看,Swift的排序算法效率非常高。

二、 快速排序

2.1 辅助空间

此法较为容易理解

辅助空间快速排序

2.2 原地快排

原地快排

原地快速排序

确定基准元素的下标

三、 优先队列

  • 什么是优先队列

    • 按照一定条件给定的条件

    • 每次加入元素都会进行排序

    • 优先级最高的元素上浮到首位

本题我们可以:

  • 限制队列元素数量

  • 更大的元素具有更高优先级

  • 当队列达到k值后

  • 移除最高优先级的元素

  • 最后剩下的就是最小的k个元素了

首先我们需要实现一下优先队列

优先队列实现

题解

优先队列

四、 逻辑冒泡

  • 创建固定容量的容器

  • 遍历元素

  • 存满后冒泡排序

  • 继续插入到头

  • 遍历直到遇到大于等于自己的就停止

  • 移除最后一个元素

优先队列

Last updated

Was this helpful?