当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
242.有效的字母异位词
题目链接:242.有效的字母异位词
本题思路较为简单,只要想到可以使用数组构建哈希表,就能够解决问题。
代码片段为:
class Solution {
public boolean isAnagram(String s, String t) {
int[] countS = new int[26];
int[] countT = new int[26];
int len = s.length();
if (t.length() != len) return false;
for (int i = 0; i < len; i++) {
countS[s.charAt(i) - 'a']++;
countT[t.charAt(i) - 'a']++;
}
for (int i = 0; i < 26; i++) {
if (countS[i] != countT[i]) {
return false;
}
}
return true;
}
}
349. 两个数组的交集
题目链接:349. 两个数组的交集
参考文章链接:代码随想录_349. 两个数组的交集
题目要求输出的结果非常重要,不能只关注给的数据类型,一定要分析清楚输出结果的要求,解题的思路很多会根据输出的要求来定。如本题中 输出结果要求唯一,并依次选择了Set集合进行解题。(Set特性:集合中不能添加重复元素)
代码片段如下:
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set = new HashSet<>();
Set<Integer> res = new HashSet<>();
for (int i : nums1) {
set.add(i);
}
for (int i : nums2) {
if (set.contains(i)) //判断,当set中包含num2的元素时,将该元素加入res集合中
res.add(i);
}
//将集合结果转化为数组
return res.stream().mapToInt(x -> x).toArray();
}
}
202. 快乐数
题目链接:202. 快乐数
参考文章链接:202. 快乐数_力扣官方题解
根据题解,能够知道存在以下两种可能
- 最终会得到1
- 最终会进入循环
事实上,在拿到题时的分析真的很重要,如果能够通过分析得到,会进入不断循环的情况,就能够判断出搜索时停止的条件。
根据快乐数的定义 - -> 三位数字的下一个最大是 9 2 + 9 2 + 9 2 = 243 9^2 + 9^2+9^2=243 92+92+92=243 --> 而四位以上的数字会掉到三位,所以,算法可能会在243以下的数字循环,或者变为1
分析后,本题就变为上题的一个变形,仍是通过set集合求解
代码如下:
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
while (n != 1 && !set.contains(n)) {
set.add(n);
n = getNextNumber(n);
}
return n == 1;
}
public int getNextNumber(int num) {
int nextNum = 0;
while (num > 0) {
int temp = num % 10;
num /= 10;
nextNum += temp * temp;
}
return nextNum;
}
}
1. 两数之和
题目链接:1. 两数之和
力扣经典评论:“有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来”。
作为力扣的第一题,两数之和其实并没有那么好解。
-
首先,应该想到可以通过暴力求解,两层for循环,时间复杂度 O ( n 2 ) O(n^2) O(n2)
-
哈希。枚举数组中的每一个元素
x
,并寻找是否存在target - x
.—即需要快速判断一个数是否出现在集合中,这时考虑用哈希法。把已经遍历过的元素和下标存到map中,并将x与之对比,判断是否存在target - x
。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
int i = 0;
for (; i < nums.length; i++) {
if (map.containsKey(target - nums[i]))
break;
else
map.put(nums[i], i);
}
return new int[]{map.get(target - nums[i]), i};
}
}