题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析:
- 本质上是考察**“查找**”算法,而查找算法分为**:顺序查找,有序表查找,插值查找,索引查找,二叉树查找,散列表查找(哈希表)**等等
- 通常朴素的算法是从头开始查找,这种方式就是所谓的 顺序查找。代码如下所示:时间复杂度较高O(n^2).
- 使用其他查找方式,例如有序表,插值,二叉树,本质上都是对数据进行有序排列进而缩短查找时间。
- 使用哈希查找,本质是散列技术,将key值和其存储位置进行散列映射:存储位置 = f(key),进而由key可以快速得到其存储位置,其时间复杂度可近似看做O(1) (忽略哈希冲突的情况下)。
Notes: 在数据量小的情况下,Hash查找可能还比不过顺序查找,但是一旦数量级很大的时候,Hash查找的优势就会很明显了。
// 顺序查找
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int i = 0;
int j = 0;
int* array = (int*)malloc(2 * sizeof(int));
array[0] = -1;
array[1] = -1;
if (nums == NULL || returnSize == NULL){
return NULL;
}
for (i = 0; i < numsSize; i++){
for (j = i + 1; j < numsSize; j++){