要求
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
代码
var twoSum = function(nums,target){
var temp;
var temp_index;
for(var i = 0;i < nums.length;i++){
temp = target - nums[i];
temp_index = nums.lastIndexOf(temp);
if(temp_index !== -1 && temp_index !== i){
return [i,temp_index];
}
leetcode耗时188ms,发现其运行很慢,即使用Array.prototype.lastIndexOf()来寻找元素索引效率比较低下.
优化
改用哈希表来搜索元素,因为其查找元素的时间复杂度为0(1).因JavaScript没有内置哈希表,因此用对象来代替,因为不用进行hash化,因此效率应该比哈希表的高.
var twoSum = function(nums,target) {
let hash = new Object()
for(let i = 0;i < nums.length;i++) {
let temp = target - nums[i]
if(hash.hasOwnProperty(temp)) {
return [hash[temp], i]
}
// 遍历的同时构建哈希表,不用事先遍历数组构建哈希表
// 因为要用hash来搜索数组元素,因此数组元素作为键值,索引其对应值
hash[nums[i]] = i
}
}
leetcode耗时64ms,测试结果为上一方法的三倍速度