前言
###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!
习题
1.两数之和
题目链接:1. 两数之和 - 力扣(LeetCode)
题面:
基本分析:每次遍历把该数存到map里,然后每次遍历时看target - nums[i]是否存在于map中,如果存在,则说明找到了
代码:
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] ans = new int[2];
Map<Integer,Integer> map = new HashMap<>();
int n = nums.length;
for(int i = 0;i<n;i++){
int a = nums[i];
int b = target-nums[i];
if(map.getOrDefault(b,-1)!=-1){
ans[0] = i;
ans[1] = map.get(b);
break;
}
map.put(a,i);
}
return ans;
}
}
2.字母异位词分组
题目链接:49. 字母异位词分组 - 力扣(LeetCode)
题面:
基本分析:字母异位词们将各字符从小到大排序后是一样的单词
代码:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> m = new HashMap<>();
for (String str : strs) {
char[] s = str.toCharArray();
Arrays.sort(s);
// s 相同的字符串分到同一组
m.computeIfAbsent(new String(s), k -> new ArrayList<>()).add(str);
}
return new ArrayList<>(m.values());
}
}
3.最长连续序列
题目链接:128. 最长连续序列 - 力扣(LeetCode)
题面:
基本分析:可以通过将每个数存到map里,然后找的时候看相邻的数在map里存不存在,但这样复杂度太高了,我采用指针遍历的线性做法
代码:
class Solution {
public int longestConsecutive(int[] nums) {
int n = nums.length;
if(n==0)return 0;
Arrays.sort(nums);
int l = 1;
int count = 1;
int max = 1;
Map<Integer,Integer> map = new HashMap<>();
map.put(nums[0],1);
while(l<n){
map.put(nums[l],1);
while(l+1<n&&nums[l]==nums[l+1])l++;//防止出现这种类型的排序:0 1 1 2
if(map.getOrDefault(nums[l]-1,0)!=0){
count++;
}else{
max = Math.max(count,max);
count = 1;
}
l++;
}
max = Math.max(count,max);
return max;
}
}
后言
上面是力扣Hot100的哈希专题,下一篇会有专题,希望有所帮助,一同进步,共勉!