Leetcode1. 两数之和(C语言)

Leetcode1. 两数之和(C语言)

数据结构-哈希表:算法与数据结构参考

题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。不能重复利用这个数组中同样的元素。例:
输入:[2, 7, 11, 15] 9
输出:[0, 1]

因为 nums[0] + nums[1] = 2 + 7 = 9

思路:
(法1:暴力,两次遍历找相应值)
法2:哈希表
Leetcode1. 两数之和(C语言)_第1张图片

代码:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 
#include 
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评论区 @光之速

你可能感兴趣的:(数据结构&算法)