twoSum
C方法(用hash)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 typedef struct HashNode 2 { 3 int key; 4 int val; 5 }HashNode; 6 7 typedef struct HashMap 8 { 9 int size; 10 HashNode** storage; 11 }HashMap; 12 13 HashMap* hash_create(int size) 14 { 15 HashMap* hashMap = malloc(sizeof(HashMap));// malloc (size) 功能:在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 16 hashMap->size = size; 17 hashMap->storage= calloc(size, sizeof(HashNode*));// (类型说明符*)calloc(n,size) 功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。(类型说明符*)用于强制类型转换。 18 //主要的不同是malloc不初始化分配的内存,已分配的内存中可以是任意的值. calloc 初始化已分配的内存为0。次要的不同是calloc返回的是一个数组,而malloc返回的是一个对象。 19 return hashMap; 20 } 21 22 HashMap*hash_get(HashMap *hashMap, int key) 23 { 24 int hash= abs(key)% hashMap->size; 25 HashNode* node; 26 while((node=hashMap->storage[hash])) 27 { 28 if(node->key==key) 29 {return node;} 30 if(hash<hashMap->size-1) 31 {hash++;} 32 else{hash =0;} 33 } 34 return NULL; 35 } 36 37 void hash_set(HashMap *hashMap, int key, int value) 38 { 39 int hash=abs(key)%hashMap->size; 40 HashNode*node; 41 while((node=hashMap->storage[hash])) 42 { 43 if(hash<hashMap->size-1)hash++; 44 else hash=0; 45 } 46 node =malloc(sizeof(HashNode)); 47 node->key=key; 48 node->val=value; 49 hashMap->storage[hash]=node; 50 } 51 52 void hash_destroy(HashMap* hashMap) 53 { 54 for(int i;i<hashMap->size;i++) 55 { 56 HashNode *node; 57 if((node=hashMap->storage[i])) 58 {free(node);} 59 } 60 free(hashMap->storage); 61 free(hashMap); 62 } 63 64 int* twoSum(int* nums, int numsSize, int target){ 65 HashMap* hashMap; 66 HashNode* node; 67 int rest,i; 68 hashMap = hash_create(numsSize * 2); 69 for(i=0;i<numsSize;i++) 70 { 71 rest=target-nums[i]; 72 node=hash_get(hashMap,rest); 73 if(node) 74 { 75 int *result =malloc(sizeof(int)*2); 76 result[0]=node->val+1; 77 result[1]=i+1; 78 hash_destroy(hashMap); 79 return result; 80 } 81 else 82 hash_set(hashMap,nums[i],i); 83 } 84 }