一、题目
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
二、第一次成功提交(C)
int* twoSum(int* nums, int numsSize, int target)
{
int *a = (int*)malloc(2*sizeof(int));
for(int i=0;i<numsSize;i++)
{
for(int j=0;j<numsSize;j++)
{
if(i!=j)
{
if(target == (nums[i]+nums[j]))
{
a[0]=i;
a[1]=j;
}
}
}
}
return a;
}
本此提交总结:
1.int a[2]之后return错误, 改为malloc申请地址,看来C的基本功还不扎实。
2.此为穷举法,双层循环时间复杂度较高。
三、学习哈希大法后提交代码(C++)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> result;
map<int,int> tmp;
for(int i=0;i<nums.size();i++)
tmp[nums[i]]=i;
for(int i=0;i<nums.size();i++)
{
if(tmp.count(target-nums[i]) && tmp[target-nums[i]]!=i)
{
result.push_back(i);
result.push_back(tmp[target-nums[i]]);
break;
}
}
return result;
}
};
本次提交总结:
1.可以代替以前的创建一个超级大的数组a,在有这个数的对应的索引值的a的数组中置1。强烈推荐以后代替成这种方法。
四、一次循环哈希大法进阶(C++)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> result;
map<int,int> tmp;
for(int i=0;i<nums.size();i++)
{
if(tmp.count(target-nums[i]) && tmp[target-nums[i]]!=i)
{
result.push_back(i);
result.push_back(tmp[target-nums[i]]);
break;
}
tmp[nums[i]]=i;
}
return result;
}
};
本此提交总结:
由于tmp[nums[i]]=i;的位置在刚进for循环那里,导致一直不通过,放到了for循环的最后通过了,说明在逻辑阶段还是有问题的,需要以后注意。
具体出错逻辑:
先判断map中是否有符合的值,再进行map的添加。而不是先添加值,再进行判断。例如[3,3],6的输入,若先添加值,则在位置1的3添加后覆盖了前面的3的索引,导致0输出出错,以后注意,逻辑一定要清楚。