Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >区间合并讲解

区间合并讲解

作者头像
用户10604450
发布于 2024-03-15 05:56:10
发布于 2024-03-15 05:56:10
12200
代码可运行
举报
文章被收录于专栏:练习两年半练习两年半
运行总次数:0
代码可运行

y总模板:

// 将所有存在交集的区间合并 void merge(vector<PII> &segs) { vector<PII> res; sort(segs.begin(), segs.end()); int st = -2e9, ed = -2e9; for (auto seg : segs) if (ed < seg.first) { if (st != -2e9) res.push_back({st, ed}); st = seg.first, ed = seg.second; } else ed = max(ed, seg.second); if (st != -2e9) res.push_back({st, ed}); segs = res; }

思路:

1.将每个区间左端点排序

2.如果下一个区间左端点大于老区间右端点,则找到了新区间,数量+1,添加新区间

否则更新较大的右端点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        int n= sc.nextInt();
        ArrayList<int []> list=new ArrayList<>();
        while (n-->0){
            int []a=new int [2];
            a[0]=sc.nextInt();
            a[1]=sc.nextInt();
            list.add(a);
        }
        System.out.println(merge(list));
    }
    public static int merge(ArrayList <int []> list){
        ArrayList <int []> newlist=new ArrayList<>();
        //对每个区间的左区间点进行升序排列
        list.sort(new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0]-o2[0];
            }
        });

        int l=Integer.MIN_VALUE,r=Integer.MIN_VALUE;
        for (int[] a : list) {
            //如果新的左区间大于旧的右区间
            if(a[0]>r){
                //那么意味着这是一个新区间,与原来区间不一样
                if(l!=Integer.MIN_VALUE) {
                    newlist.add(new int[]{l, r});
                }
                l=a[0];
                r=a[1];
            }else{
                r=Math.max(r,a[1]);
            }
        }
        if(l!=Integer.MIN_VALUE)  newlist.add(new int[]{l,r});
        list.clear();
        for (int[] b : newlist) {
            list.add(b);
        }
        return list.size();
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
区间合并(c++,java)
给定一个长度为 n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
GeekLiHua
2025/01/21
890
区间合并算法及模板应用
将多个区间进行合并,其中有交集的区间合为一个区间,没有交集的区间保留原状。注意,这里端点重合也算作一种交集区间。
timerring
2023/05/24
7180
区间合并算法及模板应用
【简单】区间和并
给定 n 个区间 \left[ {{{\rm{l}}_i},{r_i}} \right],要求合并所有有交集的区间。注意:如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:\left[ {1,3} \right],\left[ {2,6} \right] 可以合并为一个区间 \left[ {1,6} \right]。
字节星球Henry
2021/08/09
5720
算法基础:区间合并算法及模板应用
将多个区间进行合并,其中有交集的区间合为一个区间,没有交集的区间保留原状。注意,这里端点重合也算作一种交集区间。
timerring
2022/11/28
9230
算法基础:区间合并算法及模板应用
【算法】双指针、位运算、离散化、合并区间
双指针的算法可以优化时间复杂度,双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向( 快慢指针 )或者相反方向( 对撞指针 )的指针进行扫描,从而达到相应的目的。将双层暴力循环O(n^2)优化到O(n),所以双指针算法最核心的用途就是优化时间复杂度。双指针是比较常见的把,直接看例子既可以。
平凡的人1
2023/10/15
2480
【算法】双指针、位运算、离散化、合并区间
ACM算法竞赛——区间合并(模板)
// 将所有存在交集的区间合并 void merge(vector<PII> &segs) { vector<PII> res; sort(segs.begin(), segs.end()); int st = -2e9, ed = -2e9; for (auto seg : segs) if (ed < seg.first) { if (st != -2e9) res.push_back({st, ed});
战士小小白
2022/05/13
4960
ACM算法竞赛——区间合并(模板)
算法基础学习笔记——⑤离散化\区间和并
6 、 − 10000 、 114514 、 1919 、 − 123 、 1919
命运之光
2024/03/20
1850
算法基础学习笔记——⑤离散化\区间和并
基础算法篇——区间合并
基础算法篇——区间合并 本次我们介绍基础算法中的区间合并,我们会从下面几个角度来介绍: 区间合并 区间合并 我们这次的目的很简单: 快速高效的完成区间合并任务 区间合并的要求: 提供若干个区间,将有接壤的部分变为一个区间,没有接壤的部分不改变 例如[1,2],[2,3],[4,5],[6,7],[6,8]五个区间,我们需要将他们变为三个区间[1,3],[4,5],[6,8] 我们给出主要思想: /* 1.首先我们以每个分区的左侧为标准进行排序,这样我们的每次区间合并只需要采用当前区间和下一个区间对比即可,此
秋落雨微凉
2022/11/16
4250
基础算法——区间合并
由于有些读者朋友私聊我,希望出几期基础算法的讲解,kmp,dp,哈希,搜索,贪心等对初学者还是不太友好,所以我打算更新几期基础算法合集,没办法谁让我宠粉丝呢?彦祖,热巴说你呢,快关注!
秋名山码神
2022/12/13
2610
基础算法——区间合并
leetcode-56. 合并区间
  合并区间就是将有重叠区间的两个区间合成一个。首选定义一个存放 int 类型数组的集合作为临时结果集,对传进来的二维数组进行判空,若传进来的 intervals 为空,则直接返回,由于结果集是临时的结果集,记得将一维数组的集合 toArray 成题目最终返回要求的二维数组。利用函数式编程,实现 Comparator 接口,对起点进行从小到大排序,跟 foreach 类似。   定义一个循环维护的变量,当 i 的值小于 intervals 中的集合个数时,进入循环,确保能遍历到最后一个区间,每次遍历都取出区间的左右端点,若当前区间的右端点比下一个区间的左端点还大,则说明区间有重叠,将当前右端点的值与下一个区间右端点的值进行比较,取较大的值作为新区间右端点,将新区间放入结果集中并接着判断下一个区间,最后返回最终结果集,将 List<int[]> 类型转换成 0 行 n 列的格式的数组类型返回即可。
灰太狼学Java
2022/06/17
2820
leetcode-56. 合并区间
56. 合并区间(思维)
题目链接:https://leetcode-cn.com/problems/merge-intervals/
Ch_Zaqdt
2020/02/17
3270
Java实现尺取法
同学推荐的一题,看了别人及讲解,学到了一点新的东西------尺取法 例题如下: Description
萌萌哒的瓤瓤
2020/08/26
5360
leetcode刷题(76)—— 56. 合并区间
输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. 示例 2:
老马的编程之旅
2022/06/22
1970
leetcode刷题(76)—— 56. 合并区间
区间选点
贪心算法篇——区间问题 本次我们介绍贪心算法篇的区间问题,我们会从下面几个角度来介绍: 区间选点 区间分组 区间覆盖 区间选点 我们首先来介绍第一道题目: /*题目名称*/ 区间选点 /*题目介绍*/ 给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 /*输入格式*/ 第一行包含整数 N,表示区间数。 接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。
秋落雨微凉
2022/12/02
9920
区间合并
给定 n 个区间 [li,ri],要求合并所有有交集的区间。 注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。 例如:[1,3]和[2,6]可以合并为一个区间[1,6]。
dejavu1zz
2020/10/23
7520
刷穿力扣(31~60)
浪漫主义狗
2023/10/31
4150
刷穿力扣(31~60)
算法·每日一题(详解+多解)-- day14
定义全局存储最终结果集和临时结果集的变量。定义一个存储布尔值的数组并全部赋值为 false,把传进来的数组排序,排序完传入回溯,得到最终答案后返回最终结果集即可。 回溯算法传入的参数有已排序的数组和全是 false 的布尔数组。数组长度和临时结果集的长度进行比较,当临时结果集存储的个数跟传进来的数组的长度相等时说明排序完毕,若排序完毕则加入结果集,记得将临时结果集加入数组中。
苏州程序大白
2022/06/12
2770
算法·每日一题(详解+多解)-- day14
LeetCode 56,区间合并问题
今天是LeetCode专题的第33篇文章,我们一起来看LeetCode的第56题,它的难度是Medium。
TechFlow-承志
2020/05/14
4770
Leetcode No.56 合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
week
2021/05/06
4010
贪心算法——区间选点与最大不相交区间数
给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。
用户10604450
2024/03/15
2180
贪心算法——区间选点与最大不相交区间数
相关推荐
区间合并(c++,java)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验