1.题目描述

题目解答
1.连续记录
看到这道题我们第一步就可以想到先将数组进行排序,然后记录最大的连续数目。
java
public int longestConsecutive(int[] nums) {
HashMap<Integer,Integer> map= new HashMap<>();
Arrays.sort(nums);
if(nums.length == 0){
return 0;
}
int flag = nums[0];
int max= Integer.MIN_VALUE;
map.put(flag,1);
for(int i=1;i<nums.length;i++){
if(nums[i]-nums[i-1]==1){
int cur = map.get(flag);
map.put(flag,cur+1);
}
else if(nums[i]==nums[i-1]){
continue;
}
else{
flag = nums[i];
map.put(flag,1);
}
}
for(Integer i:map.values()){
if(i>max){
max =i;
}
}
return max;
}
但是,这样做会使用到排序,时间复杂度就会变为O(nlogn),这明显不符合题目给我们的需求,所以,我们需要引入集合,来实现O(1)的时间复杂度
2.哈希集合
我们可以将数组中的数字去重并放入哈希集合中,并遍历哈希集合中的每个元素,分为以下两种情况:
1.集合中含有比当前元素还小1的元素,就说明当前节点不是最初的头节点,直接进入下一个循环。
2.集合中再也没有比当前元素小1的元素,就说明是头节点,之后再去集合中查找是否有比自己大1的元素,每次循环之后都将目标数字加一,直到循环终止,就得到了当前最大连续序列的长度。在和之前得到的最大值进行比较和更新。
java
public int longestConsecutive(int[] nums) {
HashSet<Integer> set = new HashSet<>();
for (int n : nums) set.add(n); // 第一层去重其实可以省,add 天然去重
int max = 0;
for (int n : set) { // ① 遍历 set,不是 nums
if (set.contains(n - 1)) continue; // ② 有前驱就跳过(不是开头)
int len = 1; // ③ 用独立变量 len 数当前序列
while (set.contains(n + len)) {
len++; // ④ 从开头往后找:n+1、n+2...
}
max = Math.max(max, len); // ⑤ 比大小,不是累加
}
return max;
}
2.题目描述

题目解答
这道题相对上一道题简单一些,具体思想就是每次将字符串进行排序,并作为唯一的key,之后当每次遍历的时候发现key是一样的,就将原来的字符串放入当前key对应的list中。
java
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
// map:key = 排序后的字符串(异位词的统一"身份证"),value = 该组所有原单词
// 例如 "eat"、"tea"、"ate" 排序后都是 "aet",所以共用同一个 key
Map<String, List<String>> map = new HashMap<>();
// 结果列表:最后把每个分组收集起来返回
List<List<String>> res = new ArrayList<>();
// 遍历每个单词,算出它的"身份证"并归组
for (String s : strs) {
// ① 把字符串拆成字符数组(String 不可变,只能拆开排)
char[] chars = s.toCharArray();
// ② 对字符数组排序:"eat" → ['a','e','t']
Arrays.sort(chars);
// ③ 拼回字符串:"aet" ------ 这就是分组的 key
String sorted = new String(chars);
if (map.containsKey(sorted)) {
// ④a 这个组已存在:get 拿到列表引用,直接 add 原单词 s
// (不用 put 回去:map 存的是引用,改列表本身即可)
map.get(sorted).add(s);
} else {
// ④b 新组:先建空列表放进 map
map.put(sorted, new ArrayList<String>());
// 再把第一个单词加进去(漏了这步每组会少一个词!)
map.get(sorted).add(s);
}
}
// ⑤ 遍历所有分组(只取 value,key 用不上),收集进结果
for (List<String> list : map.values()) {
res.add(list);
}
return res;
}
}