帮我用c语言写一个两数之和的代码,并附带解析
时间: 2024-10-17 13:03:03 浏览: 17
当然可以。下面是一个简单的C语言程序,用于解决LeetCode上经典的“两数之和”(Two Sum)问题,即在一个整数数组中找到两个元素,使得它们的和等于给定的目标值。我们通常会使用哈希表(HashMap)来优化查找速度。
```c
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct {
int key;
int value;
} Pair;
// 创建一个新的哈希表项
Pair* create_pair(int key, int value) {
Pair *pair = (Pair*)malloc(sizeof(Pair));
pair->key = key;
pair->value = value;
return pair;
}
// 查找目标值的相反数是否已存在,如果存在返回true,不存在返回false
bool find_sum(Pair** pairs, int target, int size) {
for (int i = 0; i < size; ++i) {
if ((pairs[i]->value != -1 && pairs[i]->value == target - pairs[i]->key) || // 找到了目标值的另一半
(pairs[i]->value == -1 && pairs[i]->key + target == 0)) { // 如果目标值的另一半尚未添加,检查当前元素是否恰好为0
return true;
}
pairs[i]->value = target - pairs[i]->key; // 更新当前位置的值,继续搜索
}
return false;
}
// 主函数,输入数组和目标值,输出结果
void two_sum(int* nums, int nums_size, int target, bool* result) {
Pair* pairs = (Pair*)calloc(nums_size, sizeof(Pair));
for (int i = 0; i < nums_size; ++i) {
pairs[i] = create_pair(nums[i], -1);
}
if (find_sum(pairs, target, nums_size)) {
*result = true;
} else {
*result = false;
}
for (int i = 0; i < nums_size; ++i) {
free(pairs[i]);
}
free(pairs);
}
int main() {
int nums[] = {2, 7, 11, 15};
int nums_size = sizeof(nums) / sizeof(nums[0]);
int target = 9;
bool found = false;
two_sum(nums, nums_size, target, &found);
if (found) {
printf("找到了两数之和:nums[%d] + nums[%d] = %d\n", nums[0], nums[1], target);
} else {
printf("未找到满足条件的两数之和。\n");
}
return 0;
}
```
解析:
1. 程序定义了一个`Pair`结构体,用于存储数组元素及其索引值(哈希表键),初始值设为`-1`表示尚未找到匹配的元素。
2. `find_sum`函数遍历整个哈希表,尝试找到目标值的另一半。如果找到,或者遇到某个元素与目标值相加为0,则说明找到了解,返回`true`;否则,更新每个位置的值,继续搜索。
3. `two_sum`函数调用`find_sum`并更新结果指针`result`。
4. 主函数`main`中,创建数组实例、目标值,并调用`two_sum`获取结果,最后打印出是否找到符合条件的两数之和。
阅读全文