【算法笔记:计算两数之和】利用哈希表降低时间复杂度

已被阅读 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号