首先是直接暴力法:
时间复杂度为O(n2),空间复杂度为O(1):
int* twoSum(int* nums, int numsSize, int target) {
int* a = (int*)malloc(sizeof(int) * 2);
int i,j;
for(i = 0;i < numsSize - 1;i++)
{
for(j = i + 1;j < numsSize;j++)
if(nums[i] + nums[j] == target)
{
a[0] = i;
a[1] = j;
return a;
}
}
return NULL;
}
这种方法很简单。
第二种方法利用哈希表方法:
#define SIZE 100000
int hash(int key) { //返回元素在哈希表中的位置
int r = key % SIZE;
return r < 0 ? r + SIZE : r;
}
void insert(int *keys, int *values, int key, int value) {
int index = hash(key); //将元素插入哈希表
while (values[index]) { //处理建立哈希表中出现的冲突
index++;
index %= SIZE;
}
keys[index] = key;
values[index] = value;
}
int search(int *keys, int *values, int key) {
int index = hash(key); //在哈希表中查找元素
while (values[index]) {
if (keys[index] == key) {
return values[index];
}
index++;
index %= SIZE;
}
return 0;
}
int* twoSum(int* nums, int numsSize, int target) {
int keys[SIZE];
int values[SIZE] = {0};
for (int i = 0; i < numsSize; i++) {
int complements = target - nums[i];
int index = search(keys, values, complements);//在哈希表中查找另一个元素
if (index) { //找到了进行输出
int *indices = (int *) malloc(sizeof(int) * 2);
indices[0] = --index;
indices[1] = i;
return indices;
}
insert(keys, values, nums[i], i + 1);//没找到将这个元素插入哈希表
}
return NULL;
}
这种方法的时间空间度为O(n),但是空间复杂度为O(n)。
这是一种空间换时间的方法。
在实际应用时应该按照实际情况进行选择。