代码示例
#define HASH_SIZE 99
#define ABS(a) ((a) > 0 ? (a) : (0 - (a)))
struct HashListNode{
int key;
int val;
};
struct Hash_Node {
struct HashListNode* pNode;
struct Hash_Node* pNext;
};
struct Hash_Table {
int iNodeSize;
struct Hash_Node** pHashHead;
};
bool hashTableInit(struct Hash_Table** pHashTable) {
(*pHashTable) = (struct Hash_Table*)malloc(sizeof(struct Hash_Table));
if(NULL == (*pHashTable)) return false;
(*pHashTable)->iNodeSize = 0;
(*pHashTable)->pHashHead = (struct Hash_Node**)malloc(sizeof(struct Hash_Node*) * HASH_SIZE);
if(NULL == (*pHashTable)->pHashHead) return false;
memset((*pHashTable)->pHashHead, 0x00, sizeof(struct Hash_Node*) * HASH_SIZE);
return true;
}
bool hashTableInsert(struct Hash_Table* pHashTable, int key, int value){
long iKey = 0;
struct Hash_Node* pTmpNode = NULL;
struct HashListNode* pNode = NULL;
pNode = (struct HashListNode*)malloc(sizeof(struct HashListNode));
if(NULL == pNode) return false;
pNode->key = key;
pNode->val = value;
iKey = (long)key;
iKey = ABS(iKey) % HASH_SIZE;
if(NULL == pHashTable->pHashHead[iKey])
{
pHashTable->pHashHead[iKey] = (struct Hash_Node*)malloc(sizeof(struct Hash_Node));
if(NULL == pHashTable->pHashHead[iKey]) return false;
pHashTable->pHashHead[iKey]->pNode = pNode;
pHashTable->pHashHead[iKey]->pNext = NULL;
}
else
{
pTmpNode = pHashTable->pHashHead[iKey];
while((NULL != pTmpNode) && (NULL != pTmpNode->pNext))
{
if(key == pTmpNode->pNode->key)
{
pTmpNode->pNode->val = value;
return true;
}
pTmpNode = pTmpNode->pNext;
}
if(key == pTmpNode->pNode->key)
{
pTmpNode->pNode->val = value;
return true;
}
else
{
pTmpNode->pNext = (struct Hash_Node*)malloc(sizeof(struct Hash_Node));
if(NULL == pTmpNode->pNext) return false;
pTmpNode = pTmpNode->pNext;
pTmpNode->pNode = pNode;
pTmpNode->pNext = NULL;
}
}
pHashTable->iNodeSize += 1;
return true;
}
struct Hash_Node* getHashNode(struct Hash_Table* pHashTable, int key){
long iKey = 0;
struct Hash_Node* pTmpNode = NULL;
iKey = (long)key;
iKey = ABS(iKey) % HASH_SIZE;
pTmpNode = pHashTable->pHashHead[iKey];
while(NULL != pTmpNode)
{
if((NULL != pTmpNode->pNode) && (key == pTmpNode->pNode->key))
{
return pTmpNode;
}
else
{
pTmpNode = pTmpNode->pNext;
}
}
return NULL;
}
bool hashTableDel(struct Hash_Table* pHashTable, int key){
long iKey = 0;
struct Hash_Node* pTmpNode = NULL;
struct Hash_Node* pNextNode = NULL;
if(NULL == pHashTable) return false;
iKey = (long)key;
iKey = ABS(iKey) % HASH_SIZE;
pTmpNode = pHashTable->pHashHead[iKey];
while(NULL != pTmpNode)
{
if((NULL != pTmpNode->pNode) && (key == pTmpNode->pNode->key))
{
pNextNode = pTmpNode->pNext;
free(pTmpNode->pNode);
pTmpNode->pNode = NULL;
pTmpNode->pNext = pNextNode;
pHashTable->iNodeSize -= 1;
break;
}
else
{
pTmpNode = pTmpNode->pNext;
}
}
return true;
}
void freeHashTable(struct Hash_Table* pHashTable){
int i = 0;
struct Hash_Node* pTmpNode = NULL;
struct Hash_Node* pNextNode = NULL;
if(NULL == pHashTable) return;
for(i = 0; i < HASH_SIZE; i++)
{
pTmpNode = pHashTable->pHashHead[i];
while(NULL != pTmpNode)
{
pNextNode = pTmpNode->pNext;
if(NULL != pTmpNode->pNode)
{
free(pTmpNode->pNode);
pTmpNode->pNode = NULL;
}
free(pTmpNode);
pTmpNode = pNextNode;
}
pHashTable->pHashHead[i] = NULL;
}
return;
}
int majorityElement(int* nums, int numsSize){
int i = 0;
int iRet = 0;
struct Hash_Node* pTmpNode = NULL;
struct Hash_Table* pHashTable = NULL;
if(false == hashTableInit(&pHashTable)) return -1;
if(NULL == nums) return -1;
if(numsSize < 2) return nums[0];
for(i = 0; i < numsSize; i++)
{
pTmpNode = getHashNode(pHashTable, nums[i]);
if(NULL == pTmpNode)
{
hashTableInsert(pHashTable, nums[i], 1);
}
else
{
pTmpNode->pNode->val += 1;
if(pTmpNode->pNode->val > (numsSize / 2))
{
iRet = nums[i];
break;
}
}
}
freeHashTable(pHashTable);
pHashTable = NULL;
return iRet;
}
作者:r0vHWU5AdJ
链接:https://leetcode-cn.com/problems/majority-element/solution/chun-chashbiao-de-ying-yong-169duo-shu-yuan-su-s-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。