两数之和

题目链接: https://www.nowcoder.com/practice/20ef0972485e41019e39543e8e895b7f?tpId=188&tqId=38285&rp=1&ru=%2Factivity%2Foj&qru=%2Fta%2Fjob-code-high-week%2Fquestion-ranking&tab=answerKey.


基本思想

最开始的思路是,先对numbers数组进行排序,然后用连个索引 i 和 j 分别指向排序后的数组的头尾,再根据 numbers[i]+numbers[j]与target的大小,来判断是 i++还是j–。然而这种方法求出来的索引,是排序后的数组索引,与原始数组的索引是不同的(排序破坏了位置),因此这种方法求出来的位置信息不对。当然,有想过通过保存排序后的数在原始数组中的位置来解决问题,但是,细细一想,太过于繁琐,果断放弃了。下面的代码是针对有序数组,敲出来的代码(如果没有兴趣,可以直接略过这段代码~)

vector<int> twoSum(vector<int>& numbers, int target) {
        // write code here
        //先对数组排序
        sort(numbers.begin(),numbers.end()); 
		//用两个索引i,j分别从排序后的数组头尾开始遍历
		int i=0,j=numbers.size()-1;
		vector<int> res;
		// numbers[i]+numbers[j]<target,说明数太小,i++;numbers[i]+numbers[j]>target,说明数太大,j--;numbers[i]+numbers[j]==target 结束返回
		while((numbers[i]+numbers[j])!=target){
			if(numbers[i]+numbers[j]<target) i++;
			else j--;
		}
		res.push_back(i+1);
		res.push_back(j+1);
		return res;
    }

那面对无序的数组numbers,我们该怎样解决问题呢?一看leetcode的解题思路,恩,大神果然是大神,我怎么就没有想到呢?用map就可以轻松解决,当然,在此之前,要了解map的相关知识,我决定这个博主写得比较好,推个大家: https://blog.csdn.net/u010029439/article/details/89681773.


解题思路:

  1. 使用map来存储numbers[i]和该数在数组中的位置 i+1。
  2. 遍历数组,每次判断当前数target-numbers[i]差值是不是在map中,如果在,说明找到了,直接结束遍历,返回map中找到的那个数的位置,和当前数numbers[i]的位置 i+1;如果不在,则将当前数和其位置一起存入到map中,这里以array的方式插入map中。
    注意:本题目中,
    (1)map是这样存数据的:每一个Map元素,key-value:numbers[i]-(i+1);map的查找函数find(),查找的是关键字key,返回的是找到的关键字所在的map上的位置pos。我们要返回的是找到的关键字Key所对应的value值。因此,我们通过判断pos是不是等于map的结束位置,来判断是否找到target-numbers[i]这个关键字,如果找到,那么该关键字对应的值value为map[target-numbers[i]],即该数target-numbers[i]在原始数组中的位置。
    (2)还有人会想,以array的方式插入map,如果原来有一样的数,是不是会覆盖原来的数。这个其实没有关系,因为,题目中提到,存在唯一解。

代码

 //使用map來做 
    vector<int> twoSum(vector<int>& numbers, int target) {
    	//定义 一个map,用于存放numbers[i]的值以及该数在第一个位置
		map<int,int> mp;
		vector<int> res;
		for(int i=0;i<numbers.size();i++){
			if(mp.find(target-numbers[i])!=mp.end()){
				res.push_back(mp[target-numbers[i]]);
				res.push_back(i+1);
			}
			else mp[numbers[i]]=i+1;
		} 
		return res;
	}

总结

通过排序后再求解,返回的索引位置其实是新数组的位置,如果不加以处理,与原始数组所在的位置不一样,因此这种做法不行。利用Map来做,就一目了然了。每次map中存放的数是target-numbers[i]的差值,我们只需判断当前数numbers[i]是不是对应的另一个加数是不是在map中即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值