day5:哈希表part1
242.有效的字母异位词
什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
当哈希表长度确定时,可以用数组模拟哈希表
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) return false;
int[] record = new int[26];
for (int i = 0; i < s.length(); i++) {
record[s.charAt(i) - 'a']++;
}
for (int i = 0; i < t.length(); i++) {
record[t.charAt(i) - 'a']--;
}
for (int count : record) {
if (count != 0) return false;
}
return true;
}
}
349.两个数组的交集
判断 num2 的元素是否出现在 num1 中
同时还需要去重
所以使用HashSet
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> res = new HashSet<>();
Set<Integer> set = new HashSet<>();
for (int num : nums1) {
set.add(num);
}
for (int num : nums2) {
if (set.contains(num))
res.add(num);
}
int[] ans = new int[res.size()];
int j = 0;
for (int i : res) ans[j++] = i;
return ans;
}
}
202.快乐数
题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现!
所以这道题目可以使用哈希法,来判断这个sum是否重复出现,如果重复了就不是快乐数 return false, 否则一直找到sum为1为止。
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
while (true) {
n = getSum(n);
if (n == 1) return true;
else if (set.contains(n)) return false;
else set.add(n);
}
}
public int getSum(int n) {
int sum = 0;
while (n != 0) {
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
}
1.两数之和
本题其实有四个重点:
-
为什么会想到用哈希表
查元素(target - num[i])
-
哈希表为什么用map
要存下标与数的映射关系
-
本题map是用来存什么的
map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的
需要既查又存,这样才能一次遍历把事做完
-
map中的key和value用来存什么的
要判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。
所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下标}。
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[] {-1, -1};
}
}