您现在的位置是:首页 >其他 >leetcode刷题之哈希表相关问题js网站首页其他

leetcode刷题之哈希表相关问题js

Faith_gyz 2024-08-14 12:01:03
简介leetcode刷题之哈希表相关问题js

242.有效的字母异位符

方法一:使用两个map对象来保存

时间复杂度:O(n) 空间复杂度O(n)

var isAnagram = function(s, t) {
    if(s.length!==t.length) return false //如果长度不等,那么一定不满足要求
    //分别对字符串s t进行遍历,然后分别使用map对象进行保存
    let map1 = new Map()
    let map2 = new Map()
    //字符串是可迭代的,可以使用for of进行遍历
    for(let item of s){
        map1.set(item,map1.get(item)+1||1)
    }
    for(let item of t){
        map2.set(item,map2.get(item)+1||1)
    }
    //第三个循环 使用for of从map1中拿key,然后对map2中的进行比较
    for(let [key,val] of map1){
        //注意,当map1中的所有的属性所对应的值都和map2中的相等的时候,不存在map2中比map1多一个属性的情况
        if(!map2.get(key)||map2.get(key)!==val){
            return false
        }
    }
    return true
};

方法二:使用一个map

var isAnagram = function(s, t) {
    //使用一个map对象
    let map = new Map()
    for(let val of s){
        map.set(val,map.get(val)+1||1)
    }
    //然后遍历t,从map中进行相减
    for(let key of t){
        //map中没有这个键
        if(!map.has(key)) return false
        map.set(key,map.get(key)-1)
        if(map.get(key)==0) map.delete(key)
    }
    if(map.size==0) return true
    return false
};

349.两个数组的交集

方法一:set+map+for of

var intersection = function(nums1, nums2) {
    //时空复杂度都是O(n)
    //使用一个map对象来保存num1中的每一个键,然后使用arr保存两者间的相同的
    let map = new Map()
    let arr = []
    for(let val of nums1){
        map.set(val,map.get(val)+1||1)
    }
    for(let val of nums2){
        if(map.has(val)){
            arr.push(val)
        }
    }
    //set进行去重,然后再将对象转换为数组
    return Array.from(new Set(arr))
};

方法二:只是用set

时空都是O(n)
new Set()毫无疑问是O(n)
Array.from()也是O(n),原因见第三条:

var intersection = function(nums1, nums2) {
    let a = new Set(nums1)
    let b = new Set(nums2)
    return [...a].filter(item =>b.has(item))
};
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。