给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。用c语言
时间: 2024-09-09 15:07:42 浏览: 83
这是一个经典的计算机科学问题,通常被称为“两数之和”(Two Sum)。在C语言中,可以使用哈希表(也叫字典或关联数组)来解决这个问题,因为我们需要快速查找目标值与数组元素之间的差值。以下是简单的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
// 使用哈希表辅助查找
int* twoSum(int* nums, int numsSize, int target) {
// 创建一个哈希表存储元素及其索引
int** hashTable = (int**)malloc(numsSize * sizeof(int*));
for (int i = 0; i < numsSize; i++) {
hashTable[i] = &nums[i];
}
// 遍历数组,查找差值
for (int i = 0; i < numsSize - 1; i++) {
int complement = target - nums[i];
if (complement >= 0 && hashTable[complement - 1] != NULL) { // 如果找到差值对应的元素
printf("找到了: 第%d个元素 %d 和 第%d个元素 %d", i + 1, nums[i], complement - 1 + 1, *hashTable[complement - 1]);
free(hashTable);
return new int[] {i + 1, complement - 1 + 1}; // 返回结果数组的指针
}
}
printf("未找到解");
free(hashTable); // 清理内存
return NULL;
}
int main() {
int nums[] = {2, 7, 11, 15};
int target = 9;
int* result = twoSum(nums, sizeof(nums) / sizeof(nums[0]), target);
if (result != NULL) {
printf("结果是: 第%d个元素和第%d个元素", result[0], result[1]);
} else {
printf("结果为空");
}
return 0;
}
```
这个程序首先创建一个哈希表,然后遍历数组,对于每个元素,检查是否存在与其相加等于目标值的另一个元素。如果找到,就返回这两个元素的索引;如果没有找到,就继续搜索。注意最后记得释放动态分配的内存。
阅读全文