【题目】
给定String类型的数组strArr,再给定整数k,请严格按照排名
顺序打印出现次数前k名的字符串。
【要求】
如果strArr长度为N,时间复杂度请达到O(Nlogk)。
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <map>
#define MinData -100000
using namespace std;
typedef struct HeapStruct *MinHeap;
map<string, int> m;
struct HeapStruct {
int *Elems;
int size;
int cap;
};
MinHeap Create(MinHeap H, int Maxsize) {
H = (MinHeap) malloc (sizeof(struct HeapStruct));
H->Elems = (int*) malloc (sizeof(int) * (Maxsize + 1));
H->size = 0;
H->Elems[0] = MinData;
H->cap = Maxsize;
return H;
}
int IsFull(MinHeap H) {
if (H->size == H->cap) {
return 1;
} else {
return 0;
}
}
int IsEmpty(MinHeap H) {
if (H->size == 0) {
return 1;
} else {
return 0;
}
}
void Insert(MinHeap H, int x) {
int i;
if (IsFull(H)) {
printf("堆已满");
return;
}
i = ++H->size;
H->Elems[i] = x;
for (; x < H->Elems[i / 2]; i /= 2) {
H->Elems[i] = H->Elems[i / 2];
}
H->Elems[i] = x;
}
int dele(MinHeap H) {
int parent, child;
int temp, MinItem;
if (IsEmpty(H)) {
printf("堆为空");
return 0;
}
MinItem = H->Elems[1];
temp = H->Elems[H->size--];
for (parent = 1; parent * 2 <= H->size; parent = child) {
child = parent * 2;
if ((child + 1) <= H->size && (H->Elems[child + 1] < H->Elems[child])) {
child++;
}
if (H->Elems[child] >= temp) break;
else {
H->Elems[parent] = H->Elems[child];
}
}
H->Elems[parent] = temp;
return MinItem;
}
int main() {
int a[3];
MinHeap H;
string s[6];
H = Create(H, 3);
for (int i = 0; i < 6; i++) {
cin >> s[i];
m[s[i]]++;
}
for(map<string, int>::iterator iter = m.begin(); iter != m.end(); iter++)
{
if (H->size < 3) {
Insert(H, iter->second);
} else {
if (iter->second > H->Elems[1]) {
dele(H);
Insert(H, iter->second);
}
}
}
/*
for (int i = 3; i < 6; i++) {
if (m[s[i]] < H->Elems[1]) {
dele(H);
Insert(H, m[s[i]]);
}
}*/
/*
for(int i = 0; i < 3; i++) {
int temp = dele(H);
printf("%d ", temp);
}*/
for (int i = 0; i < 3; i++) {
a[i] = dele(H);
//printf("%d ", a[i]);
}
for (int i = 2; i >= 0; i--) {
printf("%d ", a[i]);
}
return 0;
}