给定一个整数数组A和一个整数sum,用C语言编写程序找出和为目标值sum的那两个数组元素,并返回它们的数组下标。输入第一行每个分量为数组A的元素,第二行为sum值。 输入样例: 2 7 11 15 9 输出: 0 1
时间: 2023-05-17 07:05:44 浏览: 91
C语言程序设计-求两个整数a与b之和
以下是C知道的回答:
可以使用哈希表来解决这个问题,时间复杂度为O(n)。具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 100000
typedef struct {
int key;
int val;
} HashNode;
typedef struct {
HashNode *data;
int size;
} HashTable;
int hash(int key, int size) {
return (unsigned int)key % size;
}
HashTable *createHashTable(int size) {
HashTable *ht = (HashTable *)malloc(sizeof(HashTable));
ht->data = (HashNode *)malloc(sizeof(HashNode) * size);
ht->size = size;
memset(ht->data, 0, sizeof(HashNode) * size);
return ht;
}
void destroyHashTable(HashTable *ht) {
free(ht->data);
free(ht);
}
void insert(HashTable *ht, int key, int val) {
int h = hash(key, ht->size);
while (ht->data[h].key != 0) {
h = (h + 1) % ht->size;
}
ht->data[h].key = key;
ht->data[h].val = val;
}
int find(HashTable *ht, int key) {
int h = hash(key, ht->size);
while (ht->data[h].key != 0) {
if (ht->data[h].key == key) {
return ht->data[h].val;
}
h = (h + 1) % ht->size;
}
return -1;
}
int main() {
int n, sum;
int A[MAXN];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &A[i]);
}
scanf("%d", &sum);
HashTable *ht = createHashTable(n);
for (int i = 0; i < n; i++) {
int j = find(ht, sum - A[i]);
if (j != -1) {
printf("%d %d\n", j, i);
break;
}
insert(ht, A[i], i);
}
destroyHashTable(ht);
return 0;
}
```
输入样例:
```
4
2 7 11 15
9
```
输出样例:
```
0 1
```
阅读全文