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;
    }
}
相关推荐
SL_staff2 分钟前
JVS-Rules vs Drools:金融风控团队为何转向业务可编辑的决策平台
java·spring cloud·github
Zhou1411363 分钟前
SpringMVC_03_进阶功能
java
咖啡八杯8 分钟前
常量与枚举设计规范:HttpStatus 自定义 601 警告码
java·架构·代码规范
ThinkerQAQ_8 分钟前
并发编程(六):Atomic 的实现——从 Runtime 到 CPU
java·go·picasso
垆边人似月.12 分钟前
华为算法题:最长连续递增子序列的变
数据结构·算法·leetcode
YOLO数据集集合12 分钟前
机器学习二分类预测算法组合工具:12种算法、113种组合的批量建模方案8031期
算法·机器学习
小白的码BUG之路13 分钟前
Docker -- 基本命令
java·docker·eureka
后端LV13 分钟前
把限流从「注解」做活:RateLimitKeyResolver 四种真实业务的键玩法
java·后端
longlongzihan23 分钟前
LeetCode 56合并区间:排序与贪心
c++·算法·leetcode
imDwAaY24 分钟前
Bean的生命周期
java·笔记·后端·学习·spring·dubbo