开启掘金成长之旅!这是我参与「掘金日新计划 · 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个元素
}
};
- 时间复杂度 --- sort()方法的时间复杂度为nlogn,其中n为数组长度
- 空间复杂度 --- 没有额外的辅助空间
总结
- sort()函数内部是一种优化过的快速排序,并且时间复杂度较低,比较适合用于排序的题目中。
- 当然本题还可以使用堆排序的方式去实现,通过建立大根堆辅助来实现。