首页 > 编程语言 >算法刷题:一步步优化系列01.最长连续序列

算法刷题:一步步优化系列01.最长连续序列

时间:2023-09-06 18:34:50浏览次数:38  
标签:01 cur nums int ++ 算法 num ans 刷题

题目链接:


目录


暴力解法 (超时)

class Solution {
    public int longestConsecutive(int[] nums) {
        int n = nums.length;
        int ans = 0;
        // 遍历数组中的每个元素num
        for (int i = 0; i < n; i++) {
            // 以num为起点,每次+1向后遍历num+1,num+2,num+3...
            int cur = nums[i] + 1;
            while (true) {
                // 标识是否在数组中找到了cur
                boolean flag = false;
                // 在数组中找cur
                for (int j = 0; j < n; j++) {
                    if (nums[j] == cur) {
                        flag = true;
                        break;
                    }
                }
                if (!flag) {
                    break;
                }
                cur ++;
            }
            ans = Math.max(ans, cur - nums[i]);
        }
        return ans;
    }
}

优化内层查找 (On - > O1 但超时)

class Solution {
    Map<Integer, Integer> map;
    public int longestConsecutive(int[] nums) {
        map = new HashMap<>();
        for(int i = 0; i < nums.length; i++){
            map.putIfAbsent(nums[i], 1);
        }

        int n = nums.length;
        int ans = 0;
        // 遍历数组中的每个元素num
        for (int i = 0; i < n; i++) {
            // 以num为起点,每次+1向后遍历num+1,num+2,num+3...
            int cur = nums[i] + 1;
            while (map.containsKey(cur)) {
                cur ++;
            }
            ans = Math.max(ans, cur - nums[i]);
        }
        return ans;
    }
    
}

问题:重复的边界会重新迭代

优化重复迭代:在值域而非定义域迭代,去重 (超时)

class Solution {
    public int longestConsecutive(int[] nums) {
        int min = 0x3f3f3f3f, max = -0x3f3f3f3f;
        Map<Integer, Integer> map = new HashMap<>(); 
        for(int i = 0; i < nums.length; i++){
            map.putIfAbsent(nums[i], 1);
            if(min > nums[i]) min = nums[i];
            if(max < nums[i]) max = nums[i];
        }
        int ans = 0;
        for (int i = min; i <= max; i++) { 
            int cur = i;
            while (map.containsKey(cur)) {
                cur ++;
            }
            ans = Math.max(ans, cur - i);//nums[i]);
            i = cur;
        }
        return ans;
    }
}

问题:值域大且元素离散度大时,会大量迭代到不存在的元素,空迭代

优化空迭代:HashSet去重,每次迭代的元素都存在 (26ms)

class Solution {
    public int longestConsecutive(int[] nums) {
        int ans = 0, n = nums.length;
        Set<Integer> set = new HashSet<>(128);
        for(int i = 0; i < n; i++) set.add(nums[i]);
        for(Integer k : set) {
            int cur = k;
            if(set.contains(k - 1)) continue;
            while (set.contains(cur)) {
                cur ++;
            } ans = Math.max(ans, cur - k);
        } return ans;
    }
}

从左边界重复入手再优化:HashMap存右界解法 (27ms)

class Solution {
    public int longestConsecutive(int[] nums) {
        int ans = 0, n = nums.length;
        Map<Integer, Integer> map = new HashMap<>(128);
        for(int i = 0; i < n; i++) 
            map.putIfAbsent(nums[i], nums[i]);

        for(int num : nums) {
            if(map.containsKey(num - 1)) continue;
            int rgt = map.get(num);
            if(rgt != num) continue;

            while(map.containsKey(rgt)){
                rgt++;
            } map.put(num, rgt);
            ans = Math.max(ans, rgt - num); 
            
        } return ans;
    }
}

另解:排序+链式判断(26ms)

class Solution {
    public int longestConsecutive(int[] nums) {
        if(nums.length == 0) return 0;

        int ans = 0, cur = 0;
        // Arrays.sort(nums);
        sort(nums);
        for(int i = 1; i < nums.length; i++){
            // System.out.println(nums[i] - nums[i - 1]);
            int dif = nums[i] - nums[i - 1];
            if(dif == 0) continue;
            else if(dif == 1) ++cur;
            else {
                ans = Math.max(ans, cur + 1);
                cur = 0;
            }
        }
        ans = Math.max(ans, cur + 1);
        return ans;
    }
    
    void sort(int [] nums){
        int [] tmp = new int[nums.length];
        dfs(nums, tmp, 0, nums.length - 1);
    }
    void dfs(int [] nums, int [] tmp, int lft, int rgt){
        if(lft >= rgt) return;
        int mid = (lft + rgt) >> 1;
        dfs(nums, tmp, lft, mid);
        dfs(nums, tmp, mid + 1, rgt);
        int i = lft, j = mid + 1, p = 0;
        while(i <= mid && j <= rgt)
            tmp[p++] = nums[i] < nums[j] ? nums[i++] : nums[j++];
        while(i <= mid) tmp[p++] = nums[i++];
        while(j <= rgt) tmp[p++] = nums[j++];
        for(int u = 0; u < p; u++){
            nums[u + lft] = tmp[u];
        }
    }
}

标签:01,cur,nums,int,++,算法,num,ans,刷题
From: https://www.cnblogs.com/luoyicode/p/17683098.html

相关文章

  • 安防监控/视频汇聚/云存储/AI视频智能算法引擎:遛狗AI检测算法详解
    根据最新修订发布的《中华人民共和国动物防疫法》规定:遛狗不栓绳,养狗不办证、未定期接种疫苗等行为都是违法行为。作为一个合格的“铲屎官"出门遛狗一定要牵好狗绳,保护他人和爱犬的安全。但就算法律明文规定,还是有很多人无视法律法规,在外遛狗不牵绳,任其自由活动。在日常管理中,遛狗......
  • 方案:TSINGSEE青犀视频AI智能算法平台电动车入梯检测解决方案
    一、方案背景随着大众的出行要求逐渐提升,交通拥堵现象也随处可见,电动车出行,就成了大家的首选。随着电动车数量的激增,众多用户为了个人方便,大多在室内停放或充电,有的甚至停放在走道、楼梯间等公共区域,由于电瓶车车体大部分为易燃可燃材料,一旦起火,燃烧速度快,并产生大量有毒烟气,人员逃......
  • 视频云存储/安防监控/AI分析/视频AI智能分析网关:垃圾满溢算法
    随着我国科技的发展和城市化进程加快,大家对于生活环境以及空气质量更加重视,要求越来越严格。城市街道垃圾以及生活区垃圾满溢已经成为城市之痛。乱扔垃圾,垃圾不入桶这些行为已经严重影响到了城市的美化问题。特别是炎热的夏日和雨水季节,大量垃圾堆放会释放有毒有害气体,暴雨过后,漂浮......
  • 【Leetcode刷题记录】1、统计参与通信的服务器;2、统计二叉树中好节点的数目;3、从两个
    1、统计参与通信的服务器题目:这里有一幅服务器分布图,服务器的位置标识在 m*n 的整数矩阵网格 grid 中,1表示单元格上有服务器,0表示没有。如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。请你统计并返回能够与至少一台其他服务器进行通信的服务器的......
  • 《Python魔法大冒险》 001 序章:少年小鱼的不平凡一天
     在一个普通的城市里,生活着一个名叫小鱼的少年。他是一名初中生,但在班级里,他的学习成绩总是垫底。同学们经常取笑他,有时甚至戏称他为“倒数王”。放学后,小鱼一个人走在回家的路上,他的心情沉重,仿佛背上了一座大山。今天的数学考试又是一场灾难,他甚至怀疑自己是否真的有学习的天......
  • 安防监控/视频汇聚/云存储/AI视频智能算法引擎系统:遛狗检测算法详解
    根据最新修订发布的《中华人民共和国动物防疫法》规定:遛狗不栓绳,养狗不办证、未定期接种疫苗等行为都是违法行为。作为一个合格的“铲屎官"出门遛狗一定要牵好狗绳,保护他人和爱犬的安全。但就算法律明文规定,还是有很多人无视法律法规,在外遛狗不牵绳,任其自由活动。在日常管理中,......
  • DRF01---快速上手,请求的封装,版本管理,认证,权限
    1.3djangorestframework(上)djangorestframework(简称drf)本质上其实就是一个别人编写好的app,里面集成了很多编写restfulAPI的功能功能,接下里咱们就来学习drf并用他来开发restfulAPI。drf内置了很多便捷的功能,在接下来的课程中会给大家依次讲解下面的内容:快速上手请求的......
  • 001-FactoryTalk View studio 恢复mer文件
    mer文件是AllenBradleyPanelViewPlus系列触摸屏上的运行文件,一般情况,用户在RSVIewStudioME或FactoryTakViewStudioME系统下开发完成人机界面程序后,编译成可在触摸屏上运行的mer格式文件,上传到伸触摸屏内存供其运行。由于是编译后的运行格式,它并不含有开发项目的全部信息,但......
  • 前端歌谣的刷题之路-第十三题-画一个圆
     目录前言题目 核心代码总结前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网......
  • 前端歌谣的刷题之路-第十四题-设置盒子的一个宽和高
     目录前言题目核心代码总结前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网......