1.Question:
给你一个字符串序列,再给你一个指定的数字的大小,现在询问你有没有尽可能快的思路去找到两个数的和满足这个目标的数
本题的原型大致是这样的,我们给你一个有序的数列,现在要你在有序的序列中去找两个数之和满足一个条件
在一个有序的数列中,找到这样的要求的两个数是十分的简单的
我们大致的思路就是头指针,尾指针,然后不断的向中间移动,比预计的数字大的话,我们就西安移动右指针缩小我们的数字的和,但是一旦我们的两书之和比预计的额数要小,我们就移动左指针,目的是让我们的预计和变大
证明这个算法的思路的正确性:
我们可以逆推,我们加入找到了两个数之和满足这个性质,很显然我们任意向外移动在会两个指针,那么我们在有序的列表中找到的,必然是一个小的数挥着一个大的数,那么我们的变换总可以通过郑重形式转化到新的正确的成立的两个树的位置上去
但是恩替不一样,本题强调的是无序的数组,要求我们返回的是两个数字的下表
2.Solution:
对于无序的两个数,我们也不是没有办法,我们完全可以利用哈希的思路
与到一个数,我们见这个数存储到相应的地址下表上,然后遇到下一个数我们就直接判断一下和目标数的插存不存在者只需要O(1)的时间复杂度,比我们枚举所有的情况的O(n*2)要好很多了
3.Code:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target) {
int* result=(int*)malloc(sizeof(int)*2);
int hash[100000];
int rehash[100000];
for(int i=0;i<100000;i++) hash[i]=rehash[i]=-1;
for(int i=0;i<numsSize;i++)
{
int key=target-nums[i];
if(key>=0&&hash[key]!=-1)
{
result[0]=hash[key];
result[1]=i;
break;
}
else if(key<0&&rehash[-key]!=-1)
{
result[0]=rehash[-key];
result[1]=i;
break;
}
else
{
if(nums[i]>=0) hash[nums[i]]=i;
else rehash[-nums[i]]=i;
}
}
return result;
}