描述:给定一个无序的数组,在数组中寻找两个位置,使得两个位置上的数的和为特定的值。函数返回两个数在数组中的索引。
输入:Array={2,7,11,5};Sum=9;
输出:index1=0,index2=1;
思路一:因为需要返回原始数组中的索引,因此不可以进行排序工作。暴力法,利用两个循环查找和为定值的两个数。时间复杂度为平方级,空间复杂度为1。
class Solution{
public:
int *twoSum(int A[],int n,int sum)
{
int num[2];
num[0]=num[1]=-1;
for(int i=0;i<n-1;i++)//注意外层循环下标
{
for(int j=i+1;j<n;j++)//内层循环从外部后一位开始,避免重复工作。
{
if(A[i]+A[j]==sum)
{
num[0]=i;
num[1]=j;
return num;
}
}
}
return num;
}
};
思路二:使用哈希表,key对应数组元素数值,value对应数组索引,线性遍历数组,若给定和与当前元素差值为哈希表其中key值,则输出索引对。时间复杂度为线性,空间复杂度为线性。
#include<map>
class Solution{
public:
int *twoSum(int A[],int n,int sum)
{
int num[2];
num[0]=num[1]=-1;
map<int,int> hash;
for(int i=0;i<n;i++)
map(A[i])=i;
for(int i=0;i<n;i++)
{
int tmp=sum-i;
if(map.find(tmp)!=map.end()&&map(tmp)>i)//由于是线性查找tmp在数组中的索引在i的右边
{
num[0]=i;
num[1]=map(tmp);
return num;
}
}
return num;
}
};