【数据结构与算法】——数组中的区间问题(重叠区间,合并区间,插入区间)

判断区间是否重叠

力扣 252. 会议室

给定一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,请你判断一个人是否能够参加这里面的全部会议。

示例 1::
输入: intervals = [[0,30],[5,10],[15,20]]
输出: false
解释: 存在重叠区间,一个人在同一时刻只能参加一个会议。

示例 2::
输入: intervals = [[7,10],[2,4]]
输出: true
解释: 不存在重叠区间。

思路分析

因为一个人在同一时刻只能参加一个会议,因此题目实质是判断是否存在重叠区间,这个简单,将区间按照会议开始时间进行排序,然后遍历一遍判断即可。

class Solution {
   
    public boolean canAttendMeetings(int[][] intervals) {
   
        // 将区间按照会议开始实现升序排序
        Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
        // 遍历会议,如果下一个会议在前一个会议结束之前就开始了,返回 false。
        for (int i = 1; i < intervals.length; i++) {
   
            if (intervals[i][0] < intervals[i - 1][1]) {
   
                return false;
            }
        }
        return true;
    }
}

合并区间

力扣 56. 合并区间

给出一个区间的集合,请合并所有重叠的区间。

示例 1::
输入: intervals = [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]。

示例 2::
输入: intervals = [[1,4],[4,5]]
输出: [[1,5]]

思路分析

和上一题一样,首先对区间按照起始端点进行升序排序,然后逐个判断当前区间是否与前一个区间重叠,如果不重叠的话将当前区间直接加入结果集,反之如果重叠的话,就将当前区间与前一个区间进行合并。

class Solution {
   
    public int[][] merge(int[][] intervals) {
   
        // 先按照区间起始位置排序
        Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0])

你可能感兴趣的:(算法与数据结构)