码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【LeetCode】310c:将区间分为最少组数


    310c:将区间分为最少组数

      • 题目大意
      • 思路
      • 代码
      • 时间复杂度

    原题链接: 310c:将区间分为最少组数

    题目大意

    给你一个二维整数数组 intervals ,其中intervals[i] = [lefti, righti]表示 闭 区间 [lefti, righti] 。
    你需要将intervals划分为一个或者多个区间 组 ,每个区间 只 属于一个组,且同一个组中任意两个区间 不相交 。
    请你返回 最少 需要划分成多少个组。
    如果两个区间覆盖的范围有重叠(即至少有一个公共数字),那么我们称这两个区间是 相交 的。比方说区间 [1, 5] 和[5, 8]相交。
    示例 1:

    输入:intervals = [[5,10],[6,8],[1,5],[2,3],[1,10]]
    输出:3
    解释:我们可以将区间划分为如下的区间组:
    - 第 1 组:[1, 5] ,[6, 8] 。
    - 第 2 组:[2, 3] ,[5, 10] 。
    - 第 3 组:[1, 10] 。
    可以证明无法将区间划分为少于 3 个组。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    示例 2:

    输入:intervals = [[1,3],[5,6],[8,10],[11,13]]
    输出:1
    解释:所有区间互不相交,所以我们可以把它们全部放在一个组内。
    
    • 1
    • 2
    • 3

    提示:

    1 <= intervals.length <= 10^5
    intervals[i].length == 2
    1 <= lefti <= righti <= 10^6
    
    • 1
    • 2
    • 3

    思路

    贪心。首先对所有的区间按照左端点进行从小到大排序,然后遍历。
    通过一个小根堆存储每个分组的代表区间的右端点。对于当前区间r,若其左端点小于等于最小的右端点,则说明其与所有分组都有重叠(因为已经按照左端点排序过,则当前区间的左端点大于等于先前区间的左端点),因此将其压入堆,形成新的一组。
    否则,若当前区间左端点大于堆顶区间的右端点,则不用增加组数,只需要更新该组的右端点,即将堆顶弹出再压入该组修正后的右端点。
    最终返回的堆的大小即为答案。

    代码

    class Solution {
    public:
        int minGroups(vector<vector<int>>& inters) {
            int n = inters.size();
            sort(inters.begin(), inters.end());
            priority_queue<int, vector<int>, greater<int>> heap;
            for(int i = 0; i < n; i ++ )
            {
                auto r = inters[i];
                if(heap.empty() || heap.top() >= r[0]) heap.push(r[1]);
                else
                {
                    heap.pop();
                    heap.push(r[1]);
                }
            }
            
            return heap.size();
            
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    时间复杂度

    O ( n l o g n ) O(nlogn) O(nlogn) 遍历n个区间时,每个区间涉及到堆的push等操作的复杂度为log级别。

  • 相关阅读:
    数据结构——深度优先遍历(DFS)无向连通图
    CF466E Information Graph 题解
    网页图片提取-免费在线任意网页图片提取软件
    个人博客系统
    【c++】cpp类和对象
    Flutter 创建自己的对话框,不使用任何包!
    Java版本spring cloud + spring boot企业电子招投标系统源代码
    Springboot毕设项目环球视野网站92i41(java+VUE+Mybatis+Maven+Mysql)
    【笔记】元素水平滑动(松手查看更多、滑动回弹)
    Android11.0(R) MTK 预置可卸载app恢复出厂不恢复(仿RK方案)
  • 原文地址:https://blog.csdn.net/whq___/article/details/126824322
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号