寻找和的两个加数

描述:给定一个无序的数组,在数组中寻找两个位置,使得两个位置上的数的和为特定的值。函数返回两个数在数组中的索引。

输入: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;
    }
}; 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值