(个人水平有限,请见谅!)
描述:
有一个不为空且仅包含正整数的数组,找出其中出现频率最高的前 K 个数,时间复杂度必须在 O(n log n) 以内。
输入:
一行数据包括两部分,一个正整数数组(数字间 ‘,’ 分隔)和一个正整数 K (1 ≤ K ≤ 数组长度),数组和 K 之间有一个空格。
输出:
输出包含前 K 个出现频率最高的数(出现频率相同时,较小的数在前),用 ‘, ’ 分隔,保证升序排列。
输入样例:
1,1,1,2,2,3 2
输出样例:
1,2
代码示例;
#include <iostream>
#include <bits/stdc++.h>
#include <vector>
#include <string>
using namespace std;
int main()
{
char line[1000001];
// 循环读入多行数据
while (cin.getline(line, 1000000)) {
vector<int> vec, vec_s, num, num_s;
char cstr[100];
int k = 0, ks = 0;
int flag = -1, flag_s = -1, j = -1, len = 0;
int temp = 0;
int pos = 0, pos_num = INT_MAX;
string str = "";
sscanf(line, "%s %d", cstr, &k);
ks = k;
char *p = strtok(cstr, ",");
while (p)
{
sscanf(p, "%d", &temp);
vec.push_back(temp);
p = strtok(NULL, ",");
}
sort(vec.begin(), vec.end());
for (int i = 0; i < vec.size(); i++)
{
if (vec[i] != flag)
{
vec_s.push_back(vec[i]);
num.push_back(1);
num_s.push_back(1);
flag = vec[i];
j++;
}
else
{
num[j]++;
num_s[j]++;
}
}
sort(num_s.begin(), num_s.end(), [](int a, int b){ return a > b; });
for (int i = k - 1; i >= 0; i--)
{
if (num_s[i] == num_s[k - 1])
len++;
else
break;
}
for (int i = 0; i < k-len; i++)
{
if (pos_num != num_s[i])
{
pos_num = num_s[i];
for (int j = 0; j < num.size(); j++)
{
if (num[j] == pos_num)
{
str = str + ",";
str += ('0' + vec_s[j]);
}
}
}
}
for (int i = 0; i < num.size(); i++)
{
if (num[i] == num_s[k-1] && len > 0)
{
str = str + ",";
str += ('0'+ vec_s[i]);
len--;
}
}
str.erase(0, 1);
cout << str << endl;
}
return 0;
}