/*
* 算法思想: 与两数之和相同,查找某时,重新建立hash table,查找完后销毁。
*/
typedef struct has_node{
int key;
struct has_node *next;
}HNode;
#define LEN 0xffff
void hash_insert(HNode **hb, int key) {
int index = abs(key % LEN);
HNode *node = (HNode *)malloc(sizeof(HNode));
node->key = key;
node->next = hb[index];
hb[index] = node;
}
HNode *hash_find(HNode **hb, int key) {
int index = abs(key % LEN);
HNode *node = hb[index];
while(node){
if(node->key == key) {
break;
}
node = node->next;
}
return node;
}
void hash_init(HNode **hb){
int i;
for(i=0; i<LEN; i++){
hb[i] = NULL;
}
}
void hash_exit(HNode **hb){
int i;
HNode *p, *last;
for(i=0; i<LEN; i++){
p = hb[i];
while(p){
last = p;
p = p->next;
free(last);
}
}
}
typedef struct {
HNode **hb;
int *stack;
int stack_index;
} TwoSum;
/** Initialize your data structure here. */
TwoSum* twoSumCreate() {
TwoSum* obj= (TwoSum*)malloc(sizeof(TwoSum));
obj->hb = (HNode **)malloc(sizeof(HNode *) * LEN);
obj->stack = (int *)malloc(sizeof(int) * LEN);
obj->stack_index = 0;
return obj;
}
/** Add the number to an internal data structure.. */
void twoSumAdd(TwoSum* obj, int number) {
obj->stack[obj->stack_index++] = number;
}
/** Find if there exists any pair of numbers which sum is equal to the value. */
bool twoSumFind(TwoSum* obj, int value) {
int i;
bool ret = false;
hash_init(obj->hb);
for(i=0; i<obj->stack_index; i++){
if(hash_find(obj->hb, value-obj->stack[i])) {
ret = true;
break;
}
hash_insert(obj->hb, obj->stack[i]);
}
hash_exit(obj->hb);
return ret;
}
void twoSumFree(TwoSum* obj) {
free(obj->stack);
free(obj->hb);
free(obj);
}
/**
* Your TwoSum struct will be instantiated and called as such:
* TwoSum* obj = twoSumCreate();
* twoSumAdd(obj, number);
* bool param_2 = twoSumFind(obj, value);
* twoSumFree(obj);
*/
leetcode-170. 两数之和 III - 数据结构设计-C语言
最新推荐文章于 2024-06-18 17:33:34 发布