242. 有效的字母异位词
用数组哈希
难想点:
不需要创建两个数组,第一个数组减减即可
class Solution {
public boolean isAnagram(String s, String t) {
// s 和 t 仅包含小写字母
int[] hash = new int[26];
for (int i = 0; i < s.length(); i++) {
hash[s.charAt(i) - 'a']++;
}
for (int i = 0; i < t.length(); i++) {
hash[t.charAt(i) - 'a']--;
}
for (int i = 0; i < 26; i++) {
if (hash[i] != 0) return false;
}
return true;
}
}
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
因为 unicode 字符是离散的,所以用 HashMap 代替数组即可。
349. 两个数组的交集
思路:
两个哈希表,一个判断交集,一个保存结果(起到去重作用)
重点:
学一下将 HashSet 转化为数组的传统方法
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
int n1 = nums1.length;
int n2 = nums2.length;
HashSet<Integer> set = new HashSet<>();
HashSet<Integer> resSet = new HashSet<>();
for (int i = 0; i < n1; i++) {
set.add(nums1[i]);
}
for (int i = 0; i < n2; i++) {
if (set.contains(nums2[i])) {
resSet.add(nums2[i]);
}
}
// 将 resSet 转化为数组
int[] result = new int[resSet.size()];
int index = 0;
for (int x : resSet) {
result[index++] = x;
}
return result;
}
}
202. 快乐数
思路:
哈希表判断有没有陷入轮回
一个易忽视的点:
平方和不会越来越大直至无限大,原因见 官方题解
class Solution {
public boolean isHappy(int n) {
// 1 <= n <= 2^31 - 1
HashSet<Integer> set = new HashSet<>();
int sum = getSum(n);
while (sum != 1) {
if (set.contains(sum)) {
return false;
}
set.add(sum);
sum = getSum(sum);
}
return true;
}
public int getSum(int n) {
int sum = 0;
while (n > 0) {
int digit = n % 10;
sum += digit * digit;
n /= 10;
}
return sum;
}
}
拓展方法:双指针法,与 142. 环形链表 II 类似,见 官方题解 方法二
1. 两数之和
思路:
找需要的数有没有在哈希表中出现过
重点:
元素 和 下标,元素是 key,下标是 value,别弄反了
map 是用来存放遍历过的元素的
class Solution {
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
HashMap<Integer, Integer> map = new HashMap();
for (int i = 0; i < n; i++) {
int need = target - nums[i];
if (map.containsKey(need)) {
return new int[] {map.get(need), i};
}
map.put(nums[i], i);
}
// 一定会有一个有效答案,这里返回无所谓
return null;
}
}
总结
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 这句话很重要,大家在做哈希表题目都要思考这句话。
数组其实也是一种哈希表。
哈希表包括:
- 数组。适用情形:数值比较小,范围也比较小
- set。适用情形:数值比较大,范围很大,用数组会浪费很多空间
- map
每次想用哈希法之前先想一下 能不能用数组,因为数组比较快,哈希表还得再做一次映射
1067

被折叠的 条评论
为什么被折叠?



