Leetcode1. 两数之和(C语言)
数据结构-哈希表:算法与数据结构参考
题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。不能重复利用这个数组中同样的元素。例:
输入:[2, 7, 11, 15] 9
输出:[0, 1]
因为 nums[0] + nums[1] = 2 + 7 = 9
思路:
(法1:暴力,两次遍历找相应值)
法2:哈希表
代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#include <math.h>
struct HashTable {
int a, key, value; //数组下标,索引,值
};
#define hash_fn(key) (abs(key % hsize) + 1)
#define prob_fn(key) (abs(key % hsize) + 1) //数组下标>=0
void insert(struct HashTable *htable, int hsize, int key, int value){ //hash表插入key和val
int a = hash_fn(key), tmp = a;
while (htable[tmp].a) //hash表的tmp位置数组下标未赋值
tmp = prob_fn(tmp);
htable[tmp] = (struct HashTable){a,key,value};
}
int find(struct HashTable *htable, int hsize, int key, int* idx){ //在hash表找出相应的值
int a = hash_fn(key), tmp = a;
while (htable[tmp].a && htable[tmp].key != key) //无相应值
tmp = prob_fn(tmp);
*idx = htable[tmp].value; //另一个数存储的值,直接输出是相应位置
return htable[tmp].a == a; //返回数组下标
}
int *twoSum(int *nums, int numsSize, int target, int *returnSize){
int hsize = numsSize * 2, *p = malloc(sizeof(int) * 2), idx;
struct HashTable *htable = calloc(hsize + 1, sizeof(struct HashTable));
for (int i = 0; i < numsSize; i++) {
if (find(htable, hsize, target - nums[i], &idx)) { //哈希表有,返回值
p[0] = idx;
p[1] = i;
break;
}
else insert(htable, hsize, nums[i], i); //哈希表无,插入
}
free(htable);
*returnSize = 2;
return p;
}
//参考leetcode评论区 @光之速