您的位置:首页 > Web前端

前端面试题:企业面试真题—8

2020-08-20 13:47 781 查看
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

来源:力扣(LeetCode) 链接:力扣

 

直观的写法, 循环嵌套

[code]var twoSum = function(nums, target) {
for (var i = 0; i < nums.length; i++) {
for (var j = i+1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
return [i, j]
}
}
}
return null;
};

 

这里最大的性能瓶颈是内层循环, 如果我们想快速的在nums[j]里面找到想要的元素, 不一定要求和, 也可以等价比较.

例如

[code]var twoSum = function(nums, target) {
for (var i=0; i<nums.length; i++) {
var cha = target-nums[i];  //记录差数
for (var j=i+1; j<nums.length; j++) {
if (cha == nums[j]) return [i, j]  //只要mums[j]中有相等的, 则符合条件
}
}
return null;
};

 

但内层循环依然没有去掉, 性能没有提高

用快速定位代替循环遍历

想到使用hashMap

于是再改造

[code]var twoSum = function(nums, target) {
var map = new Map();
for (var i=0; i<nums.length; i++) {
if (map.has(nums[i])) return [map.get(nums[i]), i];  //map中包含, 则符合条件
map.set(target-nums[i], i);  //记录差数及下标, 保存在map里
}
return null;
};

用map中的has方法, 取代了传统的循环比较, 效率得到了提升

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: