【哈希表】
大纲
● 242.有效的字母异位词
● 349. 两个数组的交集
● 202. 快乐数
● 1. 两数之和
leetcode 242
有效的字母异位词
思路
- 判断两字符串中出现的字符种类和个数是否相同
- 构造一个数组来统计
- 遍历维护数组得到结果
细节
- 题目中给定的字符串内容仅为小写字母 设置数组大小为26 每个字母在数组中的位置根据ASCII码序排列
- 减去首字母
a
得到从零开始的下标索引
代码
class Solution {
public boolean isAnagram(String s, String t) {
int m = s.length(), n = t.length();
if (m != n) return false;
int[] tab = new int[26];
for (int i = 0; i < m; i++) {
tab[s.charAt(i) - 'a']++;
tab[t.charAt(i) - 'a']--;
}
for (int num : tab) if (num != 0) return false;
return true;
}
}
leetcode 349
两个数组的交集
思路
- 返回两数组的元素交集 从而想到数据结构
set
由此分别求出两数组的元素 再逐个遍历
细节
- 为减少遍历次数 可先在遍历一个数组放入set 再遍历另一数组判断是否同时在两数组中 省去多写一个循环
代码
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<>(), set2 = new HashSet<>();
for (int i : nums1) set1.add(i);
for (int i : nums2) if (set1.contains(i)) set2.add(i);
int[] res = new int[set2.size()];
int k = 0;
for (int i : set2) res[k++] = i;
return res;
}
}
leetcode 202
快乐数
思路
- 由于需要求的和为1 可能会出现无限循环 而出现无限循环的时机必然为某次出现的和重复
- 通过set保存每次求出的和 若出现和已有的sum则停止循环返回
false
细节
- 求某个数的逐位 可通过
取模10 相除10
来迭代遍历
代码
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
int sum = 0;
while (true) {
sum = getSum(n);
if (sum == 1) return true;
if (set.contains(sum)) return false;
else set.add(sum);
n = sum;
}
}
public int getSum(int n) {
int sum = 0;
while (n != 0) {
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
}
leetcode 1
两数之和
思路
- 暴力求解空间最优 但是时间太久 采用空间换时间的方法
- 保存下已遍历的数 随时查看当前与之前数中是否有满足两数之和的例子
细节
- 注意使用的额外空间是map 因为需要同时记录数组的值和索引
代码
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++)
if (map.containsKey(target - nums[i]))
return new int[]{map.get(target - nums[i]), i};
else map.put(nums[i], i);
return new int[2];
}
}