什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 这句话很重要,大家在做哈希表题目都要思考这句话。
242.有效的字母异位词
https://leetcode.cn/problems/valid-anagram/description/
建议: 这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。
class Solution {
public boolean isAnagram(String s, String t) {
int[] record=new int[26];
for(int i=0;i<s.length();i++){//i是字符串的每一个索引,0,1,2,3,4等,charAt(i)是索引i对应的字符
//比如字符是a,那a-a就是0,哈希表上a的索引就是0,同理,b-a=1,b的索引是1
record[s.charAt(i)-'a']+=1;
}
//如果两个字符串出现的字母的次数相同,那整个哈希表每个索引的都是0
for(int i=0;i<t.length();i++){
record[t.charAt(i)-'a']-=1;
}
for(int count:record){
if (count!=0){
return false;
}
}
return true;
}
}
349. 两个数组的交集
建议:本题就开始考虑 什么时候用set 什么时候用数组,本题其实是使用set的好题,但是后来力扣改了题目描述和 测试用例,添加了 0 <= nums1[i], nums2[i] <= 1000 条件,所以使用数组也可以了,不过建议大家忽略这个条件。 尝试去使用set。
//SET解法
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
//这个hashset能自动去重
HashSet<Integer> set1 = new HashSet<Integer>();//存nums1
HashSet<Integer> record = new HashSet<Integer>();//存交集
for(int i:nums1){
set1.add(i);
}
for (int i:nums2){//如果set1含有nums2的字符,就放到record
if(set1.contains(i)){
record.add(i);
}
}
//交集转成数组形式
int[] arr=new int[record.size()];
int j=0;
for(int i:record){
arr[j++]=i;
}
return arr;
}
}
202. 快乐数
建议:这道题目也是set的应用,其实和上一题差不多,就是 套在快乐数一个壳子
下次再补把!
1. 两数之和
建议:本题虽然是 力扣第一题,但是还是挺难的,也是 代码随想录中 数组,set之后,使用map解决哈希问题的第一题。
做这道题有两个绊子,第一是忘记找到后要break了,第二是tmp没搞清楚定义,写成了 target-nums[0]。
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result=new int[2];
if (nums==null||nums.length==0){
return result;
}
Map<Integer,Integer> map=new HashMap<>();
//hashmap里面的key是数组元素,value是数组元素的索引
for(int i=0;i<nums.length;i++){
int tmp=target-nums[i]; //这里tmp是当前元素要找的答案
if(map.containsKey(tmp)){
result[1]=i;
result[0]=map.get(tmp);
// System.out.println(result[0]);
break;//找到后一定要跳出去
}
map.put(nums[i],i);// 如果没找到匹配对,就把访问过的元素和下标加入到map中
}
return result;
}
}