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;
    }
}
相关推荐
Jsundoku2 小时前
第六章 机器学习 -- 支持向量机
算法·机器学习·支持向量机
Hpc_Fun3 小时前
GPU 工作站品牌怎么比?五把可核验尺子、加权评分脚本与场景重排
java·信创·gpu工作站·品牌对比·加权评分
const_qiu3 小时前
第四章 03:4.3 Tools —— 让 Agent 会用工具
java·人工智能
Rain的Java大神之路3 小时前
百万并发直播弹幕系统设计全解:看懂了扇出,你就看懂了高并发的八成
java·后端·面试
?abc!3 小时前
(数组)448. 找到所有数组中消失的数字
算法
\光辉岁月/3 小时前
2.异常类
java·开发语言·异常类
淡海水3 小时前
05-03-源码-Boehm GC分配与碎片管理
开发语言·算法·unity·c#·游戏引擎·gc
十年Java程序媛3 小时前
JVM 基础与 GC 垃圾回收详解|可达性分析、分代模型、垃圾收集器、STW
java·开发语言·jvm·spring boot·后端·面试
青少儿编程课堂3 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C/C++考级:任意进制互转与大数多进制加法解析
c++·python·算法·bfs·信息学竞赛
2301_32241428043 小时前
基于SSM框架的在线考试管理系统的设计与实现14750-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·redis·mysql·tomcat·maven·mybatis·ssm