57 给出n个有序不重叠的区间,插入一个新区间,使整个区间仍有序不重叠

本文探讨了如何在已有序的、不重叠的n个区间中,正确插入一个新的区间,确保插入后所有区间仍然保持有序且不重叠的状态。这个问题涉及到区间管理和排序算法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                                                                                       点击此处返回总目录

 

【题目】

 

 

【分析】

这个题不难,但是比较恶习。。。。涉及到合并。

56题,我们做了合并区间,这个题可以转化为上一个题做。我们不用这种方法。

 

步骤(1):我们首先找到要合并的区间的起点。

当第i个的终点<newInteval的起点时,i就可以跳过。否则就可以确定起点了。有以下两种情况:

情况1:

                                     

情况2:

 

                                      

对于这两种情况:起点为Math.min(i的起点,待插入区间的起点).

 

如果找到最后也没找到这样的i,则说明新插入的区间在最后面:

                                  

 

步骤(2):找要合并的区间的终点

又分为两种情况:

情况1:当新插入的区间的终点<第i个区间的起点。这时候终点就是新区间的终点。且插入完要合并的区间之后,要插入i以后的区间。

                           或  

情况2:当新插入的区间的终点,在第i个区间的范围内。这时候终点就是第i个区间的终点。且插入完要合并的区间之后,要插入i+1以后的区间。

                         

 

特殊情况:当找到最后的时候,还是没有找到end,那end就是新插入区间的end。注意:这个时候虽然i=n,但是不能通过i==n来判断。因为情况2里面,如果在最后一个区间里找到了,我们也把i加1了。我们可以通过end是否已经改变来判断。

                   

        或 

步骤(3):把新合并的区间插入。把剩下的区间插入。

 

 

 

【代码】

 

代码比较长,但是只要清楚逻辑,就不难。

 

【结果】

 

 

 

 

 

 

 

 

 

在 Java 中,你可以使用 `java.time` 包下的 `LocalDate` 和一些集合数据结构来处理多个日期区间以及它们之间的重叠和非重叠情况。这里可以使用 `LocalDate` 对象表示日期,`Interval` 或自定义类来表示日期区间,然后通过比较操作找出重叠部分。 首先,定义一个简单的 `Interval` 类: ```java import java.time.LocalDate; import java.util.List; class Interval { private LocalDate start; private LocalDate end; public Interval(LocalDate start, LocalDate end) { this.start = start; this.end = end; } // getter and setter public boolean contains(LocalDate date) { return date.isAfter(start) && date.isBefore(end); } } ``` 接下来,我们可以创建一个方法来检查区间是否重叠,并找出所有重叠和非重叠区间: ```java import java.util.ArrayList; import java.util.List; public class DateRangeManager { public static void manageIntervals(List<Interval> intervals) { List<Interval> overlappingIntervals = new ArrayList<>(); for (int i = 0; i < intervals.size(); i++) { Interval intervalA = intervals.get(i); for (int j = i + 1; j < intervals.size(); j++) { Interval intervalB = intervals.get(j); if (intervalA.overlaps(intervalB)) { overlappingIntervals.add(intervalA); overlappingIntervals.add(intervalB); // 添加到结果列表 } else { System.out.println("Non-overlapping interval: " + intervalA + ", " + intervalB); } } } // 输出重叠区间 System.out.println("Overlapping intervals:"); for (Interval interval : overlappingIntervals) { System.out.println(interval); } } private static boolean overlaps(Interval a, Interval b) { return !a.end.isBefore(b.start) && !b.end.isBefore(a.start); } } ``` 在这个例子中,`manageIntervals` 方法会遍历所有的区间对,如果发现两个区间有交集,就将它们添加到 `overlappingIntervals` 列表中。最后打印出所有的非重叠区间重叠区间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值