目录
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。https://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。https://leetcode.cn/problems/two-sum/solutions/6873/jie-suan-fa-1-liang-shu-zhi-he-by-guanpengchn