242.有效的字母异位词
参考视频和详解
遇到哈希问题的三种数据结构:数组,set, map
- 数组:size较小,范围可控
- set:数值很大
- map:有键值对
优解思路
- 定义一个size26的数组a[0], z[25]
- 统计第一个字符串里,每一个字符出现的频率,进行++。再统计第二个字符串里,每一个字符出现的频率,进行--
- 如果哈希数组最后的每一个元素不为0,说明就不是anagram
时间/空间复杂度
- 时间复杂度: O(n)
- 空间复杂度: O(1): 空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为O(1)
遇到的问题
- java语言不熟练,比如:
- string求size:s.length(), 而不是s.length
- 数组求size: array.length,而不是array.length()
- 求字符串在index处的字符:s.charAt(i),而不是s[i]
- 字符的表示:'a',而不是“a”
349. 两个数组的交集
参考视频和详解
优解思路
unordered set
- 把num1的数值放到哈希表(去重num1)
- 遍历num2,查看哈希表里有没有num2的元素(找交集)
- 有交点,把元素放到result集合里
时间/空间复杂度
- 时间复杂度: O(n + m) m 是最后要把 set转成数组
- 空间复杂度: O(n)
遇到的问题
set的基本语法和function不熟悉
1. 如何定义一个新set
Set<Integer> set1 = new HashSet<>();
2. set的方法
- 添加元素:set.add(element)
- 查看是否包含某元素:set.contains(element)
3. 数组求长度和字符串求长度混淆
int arrSize = arr.length
int strSize = str.length()
4. 如何将set转成数组?
int[] result = new int[resSet.size()];
int i = 0;
for(int element: resSet){
result[i] = element;
i++;
}
return result;
总结
1. 什么时候用哈希表?
给你一个元素,判断这个元素在集合里是否出现过
2. 为什么不能用数组?
因为用数组的话,数值是有限制的,没有限制数值大小的时候不能用
3. 什么时候用set?
- 数组的数值没有限制
- 哈希值比较少,很分散且跨度非常大
4. set的分类
什么时候用HashSet, 什么时候用TreeSet, 什么时候用LinkedHashSet?
https://chat.openai.com/share/eff821fb-dd8c-4c39-b125-213fbb08c23a
202. 快乐数
参考视频和详解
优解思路
和349两数组交点是同一个类型
时间/空间复杂度
(这里没理解)
- 时间复杂度: O(log n)
- 空间复杂度: O(log n)
遇到的问题
1. 想不到用set的数据结构
题目说会无限循环,也就是说sum会重复出现,只要判断有重复元素就返回false
2. 不会对每个位数上的数值进行取数
先取模再相除
private int getSum(int n){
int sum = 0;
while(n != 0){
int num = n % 10; //求位数上的数
sum += num * num; //求和
n = n / 10; //取下一位的数
}
return sum;
}
1. 两数之和
参考视频和详解
优解思路
哈希表
hashMap的作用:把已经遍历过的元素存放起来
时间/空间复杂度
- 时间复杂度: O(n)
- 空间复杂度: O(n)
遇到的问题
1. Map基本语法和方法不熟悉
- 新建一个map需要两个参数:
Map<Integer, Integer> resMap = new HashMap<>();
- 增加元素:
map.put(key: num1, val: num2)
- 是否包含某元素:
map.containsKey()
- 根据key查找val:
⚠️注意不能根据val查找key,因为val是可以重复的
所以这里只能是key=nums[i], val = i (这里做题的时候颠倒了)
map.get(key)
2. 思考逻辑错误
新建一个hashMap的目的不是把数组转成map, 而是把已经遍历过的元素用hashMap存放起来。
我的解法是把数组转换成hashMap,也就是把数组里所有的元素存到hashMap里,这样做的逻辑漏洞是:当数组只有两个相同的元素,比如[3, 3],target=6时,第二个元素3是存不进hashMap的,因为map的key不能重复。那么hashmap就只有一个数3,永远找不到与其相加等于target的值。
3. 数据结构选用错误
这道题为什么不用set而是用map?
因为要根据value找index,说明存储方式是键值对
总结
1. 哈希表什么时候用?
当要判断这个元素是否出现过,或判断元素是否在集合里