哈希表-两数之和

42 篇文章 2 订阅
22 篇文章 0 订阅
         力扣题号:1. 两数之和

一、题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

二、示例

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

三、求解思路

在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。

四、代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 自定义数组
typedef struct array {
	int* arr = NULL;
	int size = 0;
}Array;

// map元素
typedef struct map {
	int key;
	int value;
}MapNode;

// 自定义哈希map
typedef struct hash_map {
	MapNode arr[1005];
}HashMap;
// 映射函数
void voidreflection(HashMap& H, int n,int index) {

	int n1 = n % 1000;
	while (H.arr[n1].key != -1 && H.arr[n1].key != n) {
		n1++;
		n1 %= 1000;
	}
	if (H.arr[n1].key == n) { // 元素重复
		return;
	}
	H.arr[n1].key = n;
	H.arr[n1].value = index;
}
// 查找哈希表中是否有该元素
int find(HashMap& H, int n) {
	int n1 = n % 1000;
	while (H.arr[n1].key != n && H.arr[n1].key != -1) {
		n1++;
		n1 %= 1000;
	}
	if (H.arr[n1].key == n) {
		return H.arr[n1].value;
	}
	return -1;
}

// 两数之和
void solution(Array& A,Array& result,int target) {
	HashMap map; // 自定义哈希表
	for (int i = 0; i < 1005; i++) {
		map.arr[i].key =  -1;
        map.arr[i].value =  -1;
	}
	voidreflection(map, A.arr[0], 0);
	for (int i = 1; i < A.size; i++) {
		int search = target - A.arr[i];
		int index = find(map, search);
		if (index !=-1) {
			result.size = 2;
			result.arr = (int*)malloc(sizeof(int)*2);
			result.arr[0] = index;
			result.arr[1] = i;
			return;
		}
		else {
			voidreflection(map, A.arr[i], i);
		}
	}
}

// 打印数组
void Print(Array& A) {
	for (int i = 0; i < A.size; i++) {
		printf("-----");
	}
	printf("\n");
	for (int i = 0; i < A.size; i++) {
		printf("%5d", i);
	}
	printf("\n");
	for (int i = 0; i < A.size; i++) {
		printf("%5d", A.arr[i]);
	}
	printf("\n");
	for (int i = 0; i < A.size; i++) {
		printf("-----");
	}
	printf("\n");
}

int main() {

	Array arr1, arr2;
	int a1[] = { 0,52,98,15,52,52,105,400,395,84,77,89,512,45,88,9,1034 };
	int a2[] = { 52,65,75,81,65,105,77,152,512,52,1034,400 };
	arr1.size = sizeof(a1) / sizeof(int);
	arr2.size = sizeof(a2) / sizeof(int);
	arr1.arr = a1;
	arr2.arr = a2;

	Array res1, res2;
	res1.size = 0;
	res2.size = 0;
	Print(arr1);
	// 两数之和
	solution(arr1, res1,120);
	Print(res1);
	
	Print(arr2);
	solution(arr2, res2,1546);
	Print(res2);

	return 0;
}

五、运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值