您的位置:首页 > Web前端

剑指offer—最小的K个数

2015-10-04 12:31 357 查看
华电北风吹

天津大学认知计算与应用重点实验室

日期:2015/10/4

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

解析:基于插入排序的思想可以想到使用一个长度为k的排序数组储存最小的k个元素,复杂度O(nk)。基于堆排序的思想可以想到对构建好的小根堆,进行k次取堆顶元素也可以达到目标,复杂度O(n+klog(n))。

class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
{
vector<int> v;
if (input.size() < k)
return v;
int n = input.size() - 1;
for (int i = (n - 1) / 2; i >= 0; i--)
{
HeapAdjust(input, i, n);
}
for (int i = 0; i<k; i++)
{
v.push_back(input.front());
swap(input.front(), input[n-i]);
HeapAdjust(input, 0, n - i - 1);
}
return v;
}
void HeapAdjust(vector<int> &input, int k, int length)
{
while (2 * k + 1 <= length)
{
int x = k;
if (input[2 * k + 1] < input[k])
x = 2 * k + 1;
if ((2 * k + 2 <= length) && (input[2 * k + 2] < input[x]))
x = 2 * k + 2;
if (x == k)
return;
else
{
swap(input[k], input[x]);
k = x;
}
}
}
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: