剑指offer 最小的k个数

来源:互联网 发布:网络包年维护服务 编辑:程序博客网 时间:2024/06/06 20:08

1.题目描述

输入n个数字,找出其中最小的k个数。

注:有的还会要求保持原有的顺序输出

2.分析

两种思路:
1)利用快排的思想,找到第k大的分界点。左边的元素都是比它小的
2)维护一个长度为k的容器,里面存放当前最小的k个数,遍历一个新的元素判断是否将其插入该容器。

3.代码

快排的思想,复杂度O(n)

void LeastK(int* array, int n,int k) {    if (array == NULL || k <= 0 || k >= n)        return;    int left = 0;    int right = n - 1;    int pivot = mypartition(array, 0, n - 1);    while (pivot != k - 1) {        if (pivot > k - 1) {            right = pivot - 1;            pivot = mypartition(array, left, right);        }        else {            left = pivot + 1;            pivot = mypartition(array, left, right);        }           }    for (int i = 0; i < k; i++)        cout << array[i] << " ";    cout << endl;}

使用最大堆,复杂度nlog(k)

void LeastK(int* array, int n, int k) {    if (array == NULL || k <= 0 || k >= n)        return;    priority_queue<int, vector<int>> maxHeap;//默认就是最大堆    for (int i = 0; i < n; i++) {        if (maxHeap.size() < k)            maxHeap.push(array[i]);        else if (array[i] < maxHeap.top()) {            maxHeap.pop();            maxHeap.push(array[i]);        }    }    while (!maxHeap.empty())    {        cout << maxHeap.top() << " ";        maxHeap.pop();    }    cout << endl;}

或者可以用multiset,降序排列,取set第一个元素是最大的。

#include<functional>multiset<int, greater<int>> myset;
原创粉丝点击