美文网首页IT面试
在一个无序数组中找到第k大的数

在一个无序数组中找到第k大的数

作者: cp3_1dbc | 来源:发表于2018-03-25 19:42 被阅读845次

这里是用了最小堆保存当前最大的k个数,堆顶即为top k中最小的数,每次和堆顶的数比较即可,实现直接用了stl的multiset(堆得具体实现这里不在赘述),调整堆得复杂度是logk,需要遍历整个数组,所以总的time cost是o(nlogk)

  • 一、使用multiset实现
#include <iostream>

int find_nth_largest(const vector<int> v, int k)
{
    int res = 0;
    multiset<int> s;
    for (int i = 0; i < k; ++i)
    {
        s.insert(v[i]);
    }

    for (int j = k; j < v.size(); ++j)
    {
        s.insert(v[j]);
        s.erase(s.begin());
    }
    
    return *s.begin();
}

int main() {
    vector<int> v4{1, 2, 3, 3, 6, 9};
    cout << find_nth_largest(v4, 2) << endl; 
    
    vector<int> v5{1, 2, 3, 3, 6, 9, 100, 88, 76};
    cout << find_nth_largest(v5, 3) << endl; 
}

执行结果

6
76
  • 二、使用make_heap实现
#include <iostream>
#include <algorithm>

int find_nth_largest2(vector<int>& v, int n)
{
    int res = 0;
    while(n-- >0) 
    {
        make_heap(v.begin(), v.end());
        pop_heap(v.begin(), v.end());
        res = v.back();
        v.pop_back();
    }
    return res;
}

int main() {
    vector<int> v4{1, 2, 3, 3, 6, 9};
    cout << find_nth_largest2(v4, 2) << endl; 
    
    vector<int> v5{1, 2, 3, 3, 6, 9, 100, 88, 76};
    cout << find_nth_largest2(v5, 3) << endl; 
}

执行结果

6
76

相关文章

  • 无序数组中找到左侧比他小右侧比他大的数

    无序数组中找到左侧比他小右侧比他大的数 无序数组中找到左侧比他小右侧比他大的数,要求时间复杂度在O(n)。思路是单...

  • 5. 第k大元素

    题目:在数组中找到第k大的元素(JAVA) 审题:输入:目标数n 输出:数组int[] nums 分析:...

  • 在一个无序数组中找到第k大的数

    这里是用了最小堆保存当前最大的k个数,堆顶即为top k中最小的数,每次和堆顶的数比较即可,实现直接用了stl的m...

  • 快速排序

    在数组中找到第k大的元素

  • 2018-09-27 215. Kth Largest Elem

    题意:给你一个无序数组,返回该数组第K大的数(重复的两个数算两个)。解题思路:使用优先队列priority_que...

  • 数组小题目

    如何找到无序数组中第K大的数?利用快速排序的思想,每次找到某节点的最终位置来缩小检索数组的大小

  • 544. 前K大数

    在一个数组中找到前K大的数样例给出 [3,10,1000,-99,4,100], k = 3.返回 [1000, ...

  • lintcode 5 寻找第k大数

    5. 在数组中找到第k大的元素 在数组中找到第k大的元素 参考 先排序,再查找。最简单,但是最麻烦,如果不止一次的...

  • 数组中找到左侧比他小右侧比他大的数

    问题如标题,数组中找到左侧比他小右侧比他大的数,无序数组,要求时间复杂度在O(n)。思路是单独创建一个标记数组,先...

  • Leetcode.215.Kth Largest Element

    题目 给定一个数组, 输出第k大的数. 思路 进行从大到小排序, 第k-1即为第k大的数. 总结 掌握快速排序.

网友评论

    本文标题:在一个无序数组中找到第k大的数

    本文链接:https://www.haomeiwen.com/subject/dsdkcftx.html