C语言给定一个整数数组 nums 和一个目标整数值 target,请你在该数组中找出 和为目标值target的那两个整数,并返回它们的数组下标。 假设每种输入只会对应一个答案,每个元素可以多次使用。 可以按任意顺序返回答案。 考虑多解和无解情况
时间: 2024-10-06 18:01:50 浏览: 27
这个问题是经典的“两数之和”(Two Sum)问题,在C语言中你可以使用哈希表(Hash Table)或者双指针方法来解决。以下是使用哈希表的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义结构体存储元素及其索引
typedef struct {
int value;
int index;
} Item;
// 函数用于查找目标值
int* twoSum(int* nums, int numsSize, int target) {
// 创建哈希表
int* hashTable = (int*)malloc(numsSize * sizeof(int));
for (int i = 0; i < numsSize; i++) {
hashTable[nums[i]] = i;
}
// 遍历数组寻找另一数
for (int i = 0; i < numsSize; i++) {
int complement = target - nums[i];
if (hashTable[complement] != NULL && hashTable[complement] != i) {
// 找到解,返回结果
int* result = (int*)malloc(2 * sizeof(int));
result[0] = i + 1;
result[1] = hashTable[complement] + 1;
return result;
}
}
// 没有找到解,返回NULL
free(hashTable);
return NULL;
}
int main() {
int nums[] = {2, 7, 11, 15};
int target = 9;
int* indices = twoSum(nums, sizeof(nums)/sizeof(nums[0]), target);
if (indices) {
printf("The indices are %d and %d.\n", indices[0], indices[1]);
free(indices);
} else {
printf("No solution found.\n");
}
return 0;
}
```
在这个例子中,我们首先创建一个哈希表,将每个数字及其对应的索引关联起来。然后遍历数组,对于每个元素,我们在哈希表中查找是否存在补数(target减去当前元素),如果找到了并且这个补数不是当前元素的索引,就找到了一组解。
阅读全文