代码随想录算法(哈希表一)

目录

242有效的字母异位词

349两个数组的交集​编辑

set解决

数组解决

1两数之和


242有效的字母异位词

如果使用暴力解法的话直接可以使用两层for循环

 我们平时用到的哈希表的数据结构就是数组 set和map

用到哈希表的话 就可以想这三个数据结构 

这个题的话只有小写的英文字母 小写字母有26个并且他的

我们可以定义一个哈希数组 可以放下26个字母就够了 

第一个数组遍历每个字母出现的频率 第二个数组遍历之后去减第一个数组遍历的频率 为0就是相等

范围可控 就用数组 范围很大的话我们使用set 每个key对应value的话我们使用map

首先我们先定义一个26的哈希数组 默认的数组里面的值都是0 判断是不是有效字母异位词的话要看数组里面是不是都是0来判断

接下来 用数组统计第一个字符串出现字母的频率 

class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length() != t.length())
            return false;
        int[] alpha = new int[26];
        for(int i = 0; i< s.length(); i++) {
            alpha[s.charAt(i) - 'a'] ++;
            alpha[t.charAt(i) - 'a'] --;
        }
        for(int i=0;i<26;i++)
            if(alpha[i] != 0)
                return false;
        return true;
    }
}

349两个数组的交集

返回交集的话是需要去重的 

这个题的话可以使用set来解决这个问题  但是之后力扣将条件改为length小于1000 这样的话可以使用数组来做哈希表解决这个问题

set解决

 当没有提示条件的那个范围来说 这个值的范围可能是非常大的 可能是上亿的数据

哈希表最擅长解决的就是给你一个元素 让你判断他是否出现过 数值很大用set 或者数值很分散(0 5 1000000)这种虽然才三个数但是还是分散很严重 也是使用set

先将number1转换为哈希表的形式 再使用number2去判断哈希表里面存在过没有 最后把存在的元素放到result中

关于set在c++中有三个set 一个是set  unorderset底层是哈希值直接映射的方式 multset和set底层是红黑树

我们使用的是unorderset  因为他的底层是数 他映射的时候效率最高 

先定义一个result集合 因为要去重可以使用underset集合

哈希表也是使用unorderset 直接把number 做一个初始化转换成为unorderset

接下来我们拿number2做查询 放入for循环中 判断他在number1中是否出现过 

如果找到的话放到result集合中 这里的话就不需要做去重的操作了 unorderset就给咱们去重了

数组解决

由于后期改了条件了 我们可以定义一个比条件稍微大一点的数组 比如说1005

首先先定义一个哈希数组 初始值都为0大小为1005 遍历number1 哈希数组下表对应的值都记录为1 这样就把number1出现的元素都做了记录了 遍历number2 在number1中出现的元素就放到result2中

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/intersection-of-two-arrays/solutions/469445/liang-ge-shu-zu-de-jiao-ji-by-leetcode-solution

1两数之和

我们使用map来解决这个问题 

map用来存放我们遍历过的元素 

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/two-sum/solutions/6873/jie-suan-fa-1-liang-shu-zhi-he-by-guanpengchn

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值