Leetcode 128,49最长连续序列,字母异位词分组

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;
    }
}
相关推荐
圣保罗的大教堂1 小时前
leetcode 1140. 石子游戏 II 中等
leetcode
mmmmath_31 小时前
LeetCode.438.找到字符串中所有字母异位词
数据结构·算法·leetcode
Nil2081 小时前
leetcode 22括号生成
算法·leetcode·深度优先
Navigator_Z1 小时前
LeetCode //C - 1237. Find Positive Integer Solution for a Given Equation
c语言·算法·leetcode
豆角焖肉1 小时前
Spring Boot入门实战:从零搭建第一个应用
java·spring boot·后端·自动配置
starzy19904 小时前
Flink基础之Per-Job-Cluster原理详解:被 Application 取代的模式
java·大数据·flink
魏 无羡10 小时前
webclient
java·webclient
神仙别闹11 小时前
基于 C++ 实现两个有序链表序列的交集
java·c++·链表
swordbob12 小时前
ReentrantLock 与 AQS 完整学习手册
java·开发语言