13、出現頻率最高的前K個元素
阿新 • • 發佈:2019-02-17
(個人水平有限,請見諒!)
描述:
有一個不為空且僅包含正整數的陣列,找出其中出現頻率最高的前 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;
}