JZ40 最小的K个数

124 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情

Day33 2023/02/08

题目链接

难度:简单

题目

给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这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
返回值:[]

思路一


根据题目因为是无序数组,所以我们可以先将数组中的元素进行升序排列(即从小到大),然后再输出前k个元素(即最小的k个元素)

关键点


  • 这里的关键是排序的方式,我们可以使用c++的库函数sort()来进行升序排序,也可以采用快排的方式

算法实现


c++代码实现

#include <vector>
class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> res; //待返回数组
        if (k == 0 || k >input.size()) return res;//非法k值,返回空数组
        sort(input.begin(), input.end()); //进行升序排列
        return vector<int>(input.begin(), input.begin()+k); //返回前k个元素
    }
};
  • 时间复杂度 o(nlogn)o(nlogn) --- sort()方法的时间复杂度为nlogn,其中n为数组长度
  • 空间复杂度 O(1)O(1) --- 没有额外的辅助空间

总结

  • sort()函数内部是一种优化过的快速排序,并且时间复杂度较低,比较适合用于排序的题目中。
  • 当然本题还可以使用堆排序的方式去实现,通过建立大根堆辅助来实现。