W3_哈希表习题

242. 有效的字母异位词

image-20220607140120064

难度 2

题解 1 26 数组记录

var isAnagram = function(s, t) {
    if(s.length!=t.length) return false;
    const res = new Array(26).fill(0);
    const base = "a".charCodeAt();
    for(const i of s){
        res[i.charCodeAt()-base]++;
    }
    for(const i of t){
        res[i.charCodeAt()-base]--;
        if(res[i.charCodeAt()-base]<0) return false;
    }
    return true;
};

复杂度

时间 On 空间 O1

思路

这里用数组比用 map 性能更好, 因为只有 26 个字母, 而 map 需要维护哈希表还要做哈希函数

349. 两个数组的交集

image-20220608123258511

难度 2

题解 1 秀操作

var intersection = function(nums1, nums2) {
    return Array.from(new Set(nums1.filter(i=>nums2.includes(i))));
};

复杂度

题解 2 Set

var intersection = function(nums1, nums2) {
    const resSet = new Set();
    const nums1Set = new Set(nums1);
    for(let i of nums2){
        if(nums1Set.has(i)){
            resSet.add(i);
        }
    }
    return Array.from(resSet);
};

复杂度

时间 On 空间 On

思路

注意使用 for of时, i 直接指的是 nums[i]而不需要里面再使用 nums[i]

202. 快乐数

image-20220608124129277

难度 3

题解 1

var getSum = function(n) {
    let sum = 0, temp = 0;
    while(n){
        temp = n%10;
        sum+=temp**2;
        n = Math.floor(n/10);
    }
    return sum;
};

var isHappy = function(n){
    let set = new Set();
    while(n!=1&&!set.has(n)){
        set.add(n);
        n = getSum(n);
    }
    return n==1;
}

复杂度

思路

难点在无限循环, 重复出现

有点想用递归做

这里要多用一个方法

1. 两数之和

image-20220608123238747

难度 1

题解 1

var twoSum = function(nums, target) {
    const res = new Map();
    let count = 0;
    nums.forEach( item => res.set(item, count++));
    for(let i =0;i<nums.length;i++){
        let j = target-nums[i];
        if(res.has(j)&&res.get(j)!=i){
            return [i, res.get(j)];
        }
    }
};

复杂度

思路

454. 四数相加 II

image-20220608123216558

难度 3

题解 1

var fourSumCount = function(nums1, nums2, nums3, nums4) {
    const res = new Map();
    for(let i of nums1){
        for(let j of nums2){
            let sum = i + j;
            res.set(sum,(res.get(sum)||0)+1);
        }
    }
    let count = 0;
    for(let i of nums3){
        for(let j of nums4){
            let sum = i + j;
            if(res.has(0-sum)) count+=res.get(0-sum);
        }
    }
    return count;
};

复杂度

思路

要分成两份, 第一部分求 sum 的时候不需要判断是否 has

383. 赎金信

image-20220608124342405

难度 3

题解 1

var canConstruct = function(ransomNote, magazine) {
    const res = new Array(26).fill(0);
    const base = "a".charCodeAt();
    for(let i of magazine){
        res[i.charCodeAt()-base]++;
    }
    for(let i of ransomNote){
        res[i.charCodeAt()-base]--;
        if(res[i.charCodeAt()-base]<0) return false;
    }
    return true;
};

复杂度

思路

和前面那题一模一样

15. 三数之和

image-20220608123156886

难度 3

题解 1

var threeSum = function(nums) {
    const len = nums.length;
    if(len<3) return [];
    nums.sort((a,b)=>a-b);
    const res = [];
    for(let i = 0;i<len-2;i++){
        if(nums[i]>0) break;
        if(i>0&&nums[i]==nums[i-1]) continue;
        let l = i+1, r = len-1;
        while(l<r){
            let sum = nums[i]+nums[l]+nums[r];
            if(sum<0){
                l++;
                continue;
            }
            if(sum>0){
                r--;
                continue;
            }
            res.push([nums[i],nums[l],nums[r]]);
            while(nums[l]==nums[++l]);
            while(nums[r]==nums[--r]);
        }
    }
    return res;
};

复杂度

思路

核心在于将三次循环变成两次, 并且考虑去重

后面使用双指针

18. 四数之和

image-20220608123133609

难度 3

题解 1

var fourSum = function(nums, target) {
    const len = nums.length;
    if(len<4) return [];
    nums.sort((a,b)=>a-b);
    const res = [];
    for(let i = 0;i<len-3;i++){
        if(i>0&&nums[i]==nums[i-1]) continue;
        for(let j = i+1;j<len-2;j++){
            if(j>i+1&&nums[j]==nums[j-1]) continue;
            let l = j+1, r = len-1;
            while(l<r){
                let sum = nums[i]+nums[j]+nums[l]+nums[r];
                if(sum<target) {l++;continue;}
                if(sum>target) {r--;continue;}
                res.push([nums[i],nums[j],nums[l],nums[r]]);
                while(nums[l]==nums[++l]);
                while(nums[r]==nums[--r]);
            }
        }
    }
    return res;
};

复杂度

思路

换汤不换药, 不过注意两点

一个是 j>i+1

一个是双指针别忘了 while 循环

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值