题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
分析:
-
C的解法就是,直接遍历数组中的所有值找与这个值不同的其他值之和为target的就行,不得不说这个参数
returnSize
是真的有点迷,我一直以为是返回指针来着,看了评论才知道不是。Note里已经说了后边会释放分配的内存,所以大胆用malloc吧。break在这里是多此一举,人已经return了。 -
C++
-
python解法用了字典查找。先定义一个字典dict,把数组里的值全部放到字典里
dict_[nums[i]]=i
,key为数组值,data为下标值。遍历数组,先用target减去这个值得到另一个数,然后找这个数是否在字典中存在,若存在,就打印下标。
C解法:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* )
{
int *a = (int *)malloc(sizeof(int) * 2);
int i, j;
for(int i=0;i<numsSize;i++)
{
for(int j=i+1;j<numsSize;j++)
{
if(nums[i] + nums[j] == target)
{
a[0] = i;
a[1] = j;
*returnSize = 2;
return a;
//break;
}
}
}
*returnSize = 0;
return a;
}
C++解法:我还没看
//哈希表,时间复杂度是O(n)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;
for(int i = 0; i < nums.size(); i++){
if(hash.count(target - nums[i])) return {hash[target - nums[i]], i};
hash[nums[i]] = i;
}
return {-1, -1};
}
};
python解法:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dict_ = {}
for i in range(len(nums)):
tmp = target - nums[i]
if tmp in dict_:
return [dict_[tmp], i]
dict_[nums[i]]=i
笔记:
- 哈希表
- C++中的vector定义
- python中的map