滴滴2017校招笔试题目——在无序数组中找到第K大数字:
方法一:比较巧妙,利用multiset自动排序(从小到大)的特性,建立一个k大小的multiset,然后从头遍历数组,如果当前数字>multiset.begin(),则删除multiset.begin(),并插入当前数字。最终multiset.begin()就是结果。
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <set>
using namespace std;
class Solution {
public:
int GetMaxk(vector<int> &input, int k) {
int len = input.size();
if (len <= 0 || k>len) return 0;
multiset<int> leastNums;
vector<int>::iterator vec_it = input.begin();
for (; vec_it != input.end(); vec_it++)
{
if (leastNums.size()<k)
leastNums.insert(*vec_it);
else
{
multiset<int>::iterator greatest_it = leastNums.begin();
if (*vec_it>*(leastNums.begin()))
{
leastNums.erase(greatest_it);
leastNums.insert(*vec_it);
}
}
}
multiset<int>::iterator iter_k = leastNums.begin();
int res = *iter_k;