【leetcode前端算法入门】哈希表(二)


前言

今天接着上篇文章的内容继续练习哈希表在算法中的应用,第一次看的朋友可以先看看我昨天写的文章《【前端算法入门】哈希表(一)》。今天学习前端算法题中使用哈希表映射特性解题的思路。

进入正文,上算法题


一、两数之和

题目如下:
给定一个整数数组 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]

解题思路:
哈希表有一个非常常见的功能就是建立映射关系,比如说设计模式里的策略模式,思路是一样的,用 hashMap 存储遍历过的元素和对应的索引,数组中元素的值作为键Key,对应的元素下标作为值Value。每在数组中遍历一个元素,看看 hashMap 中是否存在满足要求的目标数字,所有事情在一次遍历中完成(用了空间换取时间)。Map中的元素可以使用 get() 方法获取对应的值,即数组下标。
代码如下:

var twoSum = function(nums, target) {
    const map = new Map();
    for(let i = 0, len = nums.length; i < len; i++){
        if(map.get(nums[i]) !== undefined){
            return [map.get(nums[i]), i];
        } else {
            map.set(target - nums[i], i);
        }
    }
    return [];
};

二、两数组交集

题目如下:
给定两个数组,编写一个函数来计算它们的交集。
代码如下(示例):

示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
 
说明:
输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。

解题思路:
用一个map去存nums1数组里的每一项,类似map[nums1[i]] = true,然后去遍历nums2,如果在map中已经有的值,类似map[nums2[i]], 就把它push到一个数组里,并且将map[nums2[i]]设为false,后面有相同的值就不push到数组了

var intersection = function(nums1, nums2) {
    const map = {};
    const ret = [];
    for(let i = 0; i < nums1.length; i++){
        map[nums1[i]] = true;
    }
    for(let i = 0; i < nums2.length; i++){
        if(map[nums2[i]]){
            ret.push(nums2[i])
            map[nums2[i]] = false
        }
    }
    return ret;
};

总结

希望本文可以对你有所帮助,欢迎大家留言交流其他的解题思路,我们共同学习共同进步!


版权声明:本文为weixin_44045702原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。