1. 程式人生 > >13、出現頻率最高的前K個元素

13、出現頻率最高的前K個元素

(個人水平有限,請見諒!)

描述:

有一個不為空且僅包含正整數的陣列,找出其中出現頻率最高的前 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; }