滴滴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;
return res;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> array;
int num;
do {
cin >> num;
array.push_back(num);
} while (cin.get() != '\n');
//show(input);
int index;
cin >> index;
Solution src;
int res = src.GetMaxk(array, index);
cout << res << endl;
system("pause");
return 0;
}
#include <iostream>
#include <vector>
#include <unordered_set>
#include <unordered_map>
#include <algorithm> // std::sort
#include <queue>
using namespace std;
void show(vector<int> src){
for(auto i : src){
cout << i;
}
cout <<endl;
}
class Solution {
public:
int GetLeastNumbers_Solution(vector<int> input, int k) {
if (input.size() <= 0 || k <= 0 || k > input.size())
return -1;
selectLeastNumbers(input, k, 0, input.size() - 1);
return input[k - 1];
}
void selectLeastNumbers(vector<int> & input, int k, int start, int stop){
int part = partition(input, start, stop);
if (k == part)
return;
if (k < part){
stop = part - 1;
}
else{
start = part + 1;
}
selectLeastNumbers(input, k, start, stop);
}
int partition(vector<int> & input, int start, int stop){
if (input.size() <= 0)
return 0;
int privot = input[start];
while (start < stop){
while (start < stop && input[stop] >= privot){
stop--;
}
swap(input[stop], input[start]);
while (start < stop && input[start] <= privot){
start++;
}
swap(input[start], input[stop]);
}
return start;
}
};
int main()
{
vector<int> input;
int a,n;
do {
cin >> a;
input.push_back(a);
}while(cin.get() != '\n');
cin>> n;
//show(input);
//cout <<n<< endl;
Solution test;
int k = input.size() + 1 - n;
int res = test.GetLeastNumbers_Solution(input,k);
cout <<res<< endl;
}