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;
    }
}
相关推荐
2601_962106644 小时前
【Java Set综合实战】商品管理系统 + 图书收藏系统|Product、Book自定义类全套代码
java
RuoyiOffice5 小时前
SpringBoot+Vue3 凭证生命周期设计:审核、过账、冲销与反过账怎样保持账目一致
java·spring boot·事务·springboot3·财务系统·会计凭证·ruoyi office
GoAI5 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
2601_962106645 小时前
HashMap入门|工号-姓名键值存储、两种遍历方式、根据key/value查
java
Pniubi6 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
杨凯凡6 小时前
Spring Framework 7 API 版本管理实战:请求头路由、兼容迁移与废弃策略
java·rest api·springframework·spring boot 4·api版本管理
T_Wizard6 小时前
同一个问题写了 4 遍:官方 SDK / HTTP / Spring AI / LangChain4j,到底该选哪个
java·ai编程
hai_android6 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
斯维赤7 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构