leetcode 1. 两数之和 C语言版

首先是直接暴力法:

时间复杂度为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)。

这是一种空间换时间的方法。

在实际应用时应该按照实际情况进行选择。

猜你喜欢

转载自blog.csdn.net/ASZZY/article/details/83059328