twoSum

C方法(用hash)

 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 }
twoSum
原文地址:https://www.cnblogs.com/daocaorenblog/p/4779885.html