LeetCode 真题 1.两数之和
描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]。
诚然此题如果纯粹用双重遍历暴力解决,但是这样做又怎么能对得起一个极客的职业素养呢。那么如何解决掉它?
这种寻找目标的问题如果要找到对应的目标,只是一昧的穷举,那么运算将会无穷大,那么在已知目标值的前提下求取目标值所在数组的索引。显而易见,用散列表是最佳选择。
可以先用哈希表Map绑定key,value键值对,然后遍历元素的时候,计算出目标值,用目标值匹配哈希表,为空则不存在,否之则有目标值,并输出对应的元素下标。
var tosum = function(nums,target){
var map = new Map();
var collect = [];
for(var i=0;i<nums.length;i++){
var a = target - nums[i]; //获取目标值,每个元素木不知不同
if(map.has(a)&&map.get(a)!=i){ //若哈希表包含此元素的目标值,且目标值对应的索引不等于i(即找的对象不等于元素本身)
collect.push(map.get(a)); //获取这两个索引
collect.push(i);
}
map.set(nums[i],i); //添加键值对
return collect;
}