我們知道,C語言里面是沒有hash表的,但是我們可以用一個結構體表示,對結構體排序,我們可以用qsort排序。
下面我們用一個LeedCode上面的一道題目講解。
347. 前 K 個高頻元素
這個題目是讓我們求解前k個高頻元素,求解思路如下:我們構建一個Hash表,Hash表用一個結構體表示,該結構體存放元素值和元素的個數,我們先把數組里面的值存放到Hash表里面,然后我們對該Hash表按照元素個數進行進行排序,這樣就可以找到前k個高頻元素了。
1 定義Hash表
#define Hash_SIZE 20001
#define OFFSET 10000 typedef struct {int val; //存放值int cnt; //cnt存儲出現次數
}HashTable;
HashTable hash[Hash_SIZE];
hash就是我們要的Hash表。
2 將數組值存放到Hash表中
for (i = 0; i < numsSize; i++) { //將值和出現的次數放入hash表中hash[(nums[i] + OFFSET) % Hash_SIZE].cnt++; //偏移使下標>=0hash[(nums[i] + OFFSET) % Hash_SIZE].val = nums[i];}for (i = 0; i < Hash_SIZE; i++) { //對原hash表進行優化,從開始存儲if (hash[i].cnt != 0) {hash[j].cnt = hash[i].cnt;hash[j].val = hash[i].val;j++;}}
3 對Hash表按照元素個數進行排序
int comp(const void* a, const void* b) { //cnt大到小return (((HashTable*)b)->cnt - ((HashTable*)a)->cnt);
}qsort(hash, j, sizeof(HashTable), comp);
全部代碼:
#define Hash_SIZE 20001
#define OFFSET 10000 typedef struct {int val;int cnt; //cnt存儲出現次數
}HashTable;
HashTable hash[Hash_SIZE];int comp(const void* a, const void* b) { //cnt大到小return (((HashTable*)b)->cnt - ((HashTable*)a)->cnt);
}int* topKFrequent(int* nums, int numsSize, int k, int* returnSize) {memset(hash, 0, sizeof(hash)); //初始化0int i, j = 0;for (i = 0; i < numsSize; i++) { //將值和出現的次數放入hash表中hash[(nums[i] + OFFSET) % Hash_SIZE].cnt++; //偏移使下標>=0hash[(nums[i] + OFFSET) % Hash_SIZE].val = nums[i];}for (i = 0; i < Hash_SIZE; i++) { //對原hash表進行優化,從開始存儲if (hash[i].cnt != 0) {hash[j].cnt = hash[i].cnt;hash[j].val = hash[i].val;j++;}}qsort(hash, j, sizeof(HashTable), comp);for (i = 0; i < k; i++) nums[i] = hash[i].val; //輸出前k個高頻元素*returnSize = k;return nums;
}
其他
為什么OFFSET是10000,Hash_Size是20001,我看別人的解釋是這個題目數的范圍是-10000到+10000。超過這個范圍會報錯