已被阅读 919 次 | 文章分类:javascript | 2022-03-09 23:42
如何用哈希表降低时间复杂度
1 题目要求
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
2 暴力解法
乍眼看去,这个题还是比较简单;就是两层循环嘛;
第一遍循环用数组中所有元素当一遍加数;第二遍循环求和,如果和与目标值一样则终止循环返回下标即可
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
for(let i=0;i<nums.length;i++){
for(let j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]===target){
return [i,j]
}
}
}
};
但是这种解法时间复杂度为O(n2);那么有更快的方式吗,也就是时间复杂度为O(n)的;请看下一种解法
3 哈希表法
其实在很多算法优化中,大家常听的一种方式就是在遍历的同时,记录一些信息,可以省去一层循环;因为记录信息需要空间,所以就是我们常说的用空间换时间的做法
所以怎么能在遍历的同时记录遍历过的数值和对应下标呢,这里可以借助javascript的哈希表Map()实现存储和查询,以及判断是否存在
javascript中的哈希表可以用Map构造函数代替;他提供了has,get, delete,set,clear 五种方法;
基本原理:将数组第一个值存到哈希表,值作为哈希键,索引作为哈希值,那么在后面遍历过程中,判断目标值target与当前指针指向的值的差是在哈希表存在,若存在则直接return他们的下标;若不存在则将当前指针的值和索引存入哈希表,保存下来,提供给后续使用
代码也很简单,简单测试了下问题;时间大大降低
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let _map=new Map();
_map.set(nums[0],0);
for(let i=1;i<nums.length;i++){
if(_map.has(target-nums[i])){
return [_map.get(target-nums[i]),i]
}else{
_map.set(nums[i],i)
}
}
};
QQ:3410192267 | 技术支持 微信:popstarqqsmall
Copyright ©2017 xiaobaigis.com . 版权所有 鲁ICP备17027716号