目次
トピック
整数配列 nums と整数ターゲット値 target が与えられた場合、その合計が配列内のターゲット値 target である 2 つの整数を見つけて、それらの配列添字を返します。
#include <stdio.h>
#include <stdlib.h>
int *two_sum(int *nums, int nums_size, int target) {
// 哈希表,用于存储整数和下标
int hash[10000] = {
0};
// 结果数组,存放两个整数的下标
static int result[2];
for(int i = 0; i < nums_size; i++) {
// 取目标值和当前整数的差值
int complement = target - nums[i];
// 如果差值不在 hash 中,则添加,key 为 整数,value 为 idx+1(避免出现为 0 的情况)。
if (0 == hash[complement]) {
hash[nums[i]] = i + 1;
} else {
// 如果差值存在 hash 中,则直接取出整数的 idx-1(因为存的时候 +1 了)。
result[0] = hash[complement] - 1;
// 另外一个 idx 就是当前整数。
result[1] = i;
return result;
}
}
return NULL;
}
int main() {
int nums[] = {
1, 2, 3, 4, 5}; // 随机数组
int nums_size = 5; // 数组长度
int target = 6; // 目标和
int *result = two_sum(nums, nums_size, target);
if (NULL == result) {
printf("No result found!\n");
} else {
printf("result index: [%d, %d]\n", result[0], result[1]);
}
}
- 時間計算量はO(n) で、n 個の要素を含む配列は 1 回だけトラバースされ、ハッシュ テーブル内の各ルックアップには O(1) 時間しかかかりません。
- スペースの複雑さは: O(n) です。必要なメモリ スペースは、ハッシュ テーブルに格納されている要素の数に依存し、テーブルには最大で n 個の要素を格納する必要があります。