力扣题号: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;
}