前言
今日联系:掌握哈希表的高频使用方法,理解hashmap的优势
1.查找更快
2.天然去重:哈希表key唯一
3.统计:经常被用于统计
1:两数之和
题目要求:给你一个整数数组nums和目标值target
要求:找出数组中哪两个数之和=target,并返回对应下标
核心思路
想到用HashMap:应为hashmap有对应关系。一个存放一个数的同时存放其对应下标
代码实现
java
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> res=new HashMap<>();
for(int i=0;i<nums.length;i++){
int need=target-nums[i];
if(res.containsKey(need)){
return new int[]{res.get(need),i};
}
res.put(nums[i],i);
}
return new int[0];
}
}
总结
记住hash表的优势
以及一些语法:.containsKey
49:字母异位词分组
题目要求:给定一个字符串数组
要求:将字母异位词组合在一起
核心思路
这题的底层还是hashmap,只不过进阶了一下
简单题目的key可以直接得到,对于这道题来说,得到key的过程是:我们将每一个字符串元素通过拆成char,然后进行array.sort排序得到的结果在toString就得到了key。
代码实现
java
Map<String,List<Stirng>> map=new HashMap<>();
for(String s:strs){
char[] chars=s.toCharArray();
Arrays.sort(chars);
Stirng key=new String(chars);
//如果map中没有这个key,先创建列表
map.computeIfAbsent(key,k->new ArrayList<>());
//添加当前字符串到对应列表
map.get(key).add(s);
}
//返回所有的值
return new ArrayList<>(map.values);
总结
记住核心思路
语法知识:map.computeIfAbsent(key,k->new ArrayList<>());等价于:
if (!map.containsKey(key)) {
map.put(key, new ArrayList<>());
}
128:最长连续序列
题目要求:题目给你一个没排过序的整数数组 nums,
要求:让你找出最长连续序列的长度。
时间复杂度是O(n),代表了我们无法用排序方法
核心思路
先用hashset来去重,将元素全放到集合中
然后遍历每一个元素,判断该元素是否为序列的起点(set.contains(num-1))
是起点:while循环找num+1
不是起点,直接跳过,并且长度+1
代码实现
java
class Solution {
public int longestConsecutive(int[] nums) {
HashSet<Integer> set=new HashSet<>();
for(int num:nums){
set.add(num);
}
int longest=0;
for(int num:set){
//判断当前num是否为队头
if(!set.contains(num-1)){
int currentNum=num;
int currentLen=1;
//当num不是队尾时,继续更新
while(set.contains(currentNum+1)){
currentLen++;
currentNum++;
}
longest=Math.max(longest,currentLen);
}
}
return longest;
}
}
总结
核心:哈希表 + 找起点 + 递增计数
语法基础,理解本题思路流程,做出了就很流畅了。