Leetcode1. 两数之和(C语言)

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评论区 @光之速
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值