给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
给定 nums = [2, 7, 11, 15], target = 9。因为 nums[0] + nums[1] = 2 + 7 = 9。所以返回 [0, 1]
思路
利用for循环嵌套,遍历同一个数组。(太暴力了~~~)
var twoSum = function(nums, target) {
var arry = [];
for(var i=0;i < nums.length;i++){
for(var j = i+1;j < nums.length;j++){
if(target === nums[i]+nums[j]){
arry = arry.concat(i,j);
return arry
};
};
};
};
其他解法:
思路:利用哈希表
哈希表常常用来存储key-value的数据,由于我们最终是要获取目标元素索引,所以代码实现中直接使用数组元素作为位置映射,用于存储当前元素索引。其次,巧妙通过var dif = target - nums[i]分别获取目标值与当前遍历元素的差值,如果这个差值作为哈希表的索引能访问到有效元素,那么说明当前遍历的i与arry[dif](拿到的是元素在nums中的索引)就是要找的索引。
var twoSum = function(nums, target) {
var arry = [];
for(var i=0;i < nums.length;i++){
var dif = target - nums[i];
if (arry[dif] != undefined){
return [arry[dif], i];
};
arry[nums[i]] = i;
//key-value 对应
};
};
优化第二版 将数组改为字典提升运行时间
var twoSum = function(nums, target) {
var dict = {};
for(var i=0;i < nums.length;i++){
var diff = target - nums[i];
if (diff in dict){
return [dict[diff], i];
};
dict[nums[i]] = i;
};
};