40 最小的k个数
题目
输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
C++题解
排序之后返回前k个数字,时间复杂度为O(nlogn)
方法一
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> res;
if(input.size() < k)
return res;
sort(input.begin(),input.end());
for(int i=0;i<k;i++)
{
res.push_back(input[i]);
}
return res;
}
};
方法二
大顶堆,时间复杂度为O(nlogk)
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> res;
if (input.size() < k)
return res;
priority_queue<int> heap;
for(auto x : input)
{
heap.push(x);
//元素个数大于k的时候,弹出堆顶的最大元素
if (heap.size() > k)
heap.pop();
}
while(heap.size())
{
res.push_back(heap.top());
heap.pop();
}
// 两种方法都可以
reverse(res.begin(),res.end());
//sort(res.begin(),res.end());
return res;
}
};
python 题解
方法一
# -*- coding:utf-8 -*-
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
if len(tinput) < k:
return []
tinput.sort()
return tinput[:k]
方法二
# -*- coding:utf-8 -*-
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
import heapq
#此方法时间复杂度为O(nlogk)
if k >len(tinput):
return []
return heapq.nsmallest(k,tinput)