(每日一题)NC37合并区间

一、题目描述

描述:

        给出一组区间,请合并所有重叠的区间。请保证合并后的区间按区间起点升序排列。

示例1:

输入:
[[10,30],[20,60],[80,100],[150,180]]

输出:
[[10,60],[80,100],[150,180]]

示例2:

输入:
[[0,10],[10,20]]

输出:
[[0,20]]

二、题解

1、分析

核心思想:如果两个区间存在交集(即一个区间的开始值小于或等于另一个区间的结束值),则它们可以合并成一个新的区间,这个新区间的开始值为原两个区间开始值中的较小者,结束值为原两个区间结束值中的较大者。通过遍历所有区间,我们可以得到最终的合并结果。

解题步骤:

(1)检查输入的区间列表是否为空或只包含一个区间,如果是,则直接返回原列表,因为无需合并。
(2)对区间列表按开始值进行排序,以便后续合并操作。
(3)初始化一个空列表用于存储合并后的区间,并设置当前区间为排序后的第一个区间
(4)遍历排序后的区间列表,从第二个区间开始

  •  如果当前区间的结束值大于等于下一个区间的开始值,说明存在交集,更新当前区间的结束值为两者结束值中的较大者。
  • 如果不存在交集,则将当前区间添加到合并后的列表,并更新当前区间为下一个区间。

(5)将最后一个区间添加到合并后的列表。
(6)返回合并后的区间列表。

2、代码

// NC37 合并区间  
  
import java.util.ArrayList;  
import java.util.Comparator;  
import java.util.List;  
  
class Interval {  
    int start;  
    int end;  
  
    public Interval(int start, int end) {  
        this.start = start;  
        this.end = end;  
    }  
}  
  
public class Main {  
    // 合并区间的方法  
    private static List<Interval> merge(List<Interval> intervals) {  
        // 如果区间列表为空或只包含一个区间,直接返回原列表  
        if (intervals == null || intervals.size() <= 1) {  
            return intervals;  
        }  
  
        // 对区间列表按开始值进行排序  
        intervals.sort(Comparator.comparingInt(interval -> interval.start));  
  
        // 初始化合并后的区间列表  
        List<Interval> merged = new ArrayList<>();  
        // 设置当前区间为排序后的第一个区间  
        Interval curInterval = intervals.get(0);  
  
        // 遍历排序后的区间列表  
        for (int i = 1; i < intervals.size(); i++) {  
            // 获取下一个区间  
            Interval nextInterval = intervals.get(i);  
            // 如果存在交集  
            if (nextInterval.start <= curInterval.end) {  
                // 更新当前区间的结束值为两者结束值中的较大者  
                curInterval.end = Math.max(curInterval.end, nextInterval.end);  
            } else {  
                // 不存在交集,将当前区间添加到合并后的列表  
                merged.add(curInterval);  
                // 更新当前区间为下一个区间  
                curInterval = nextInterval;  
            }  
        }  
        // 将最后一个区间添加到合并后的列表  
        merged.add(curInterval);  
        // 返回合并后的区间列表  
        return merged;  
    }  
  
    public static void main(String[] args) {  
        // 创建一个区间列表  
        List<Interval> intervals = new ArrayList<>();  
        // 添加区间到列表  
        intervals.add(new Interval(10, 30));  
        intervals.add(new Interval(20, 60));  
        intervals.add(new Interval(80, 100));  
        intervals.add(new Interval(150, 180));  
  
        // 调用合并区间的方法  
        List<Interval> mergedIntervals = merge(intervals);  
        // 输出合并后的区间  
        for (Interval interval : mergedIntervals) {  
            System.out.print("[" + interval.start + "," + interval.end + "]");  
        }  
    }  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ai旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值