算法通关村17关 | 盘点面试大热门之区间问题

1. 判断区间是否重叠

题目

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

算法通关村17关 | 盘点面试大热门之区间问题_第1张图片

思路

遍历所有区间,判断下个区间开始是否小于上个区间结束,小于则合并,更新数组中该元素的结尾数字,

代码

    /**
     * 判断区间是否重叠
     * @param intervals
     * @return
     */
    public boolean chongdie(int[][] intervals){
        //将区间按照会议开始时间进行排序,升序
        Arrays.sort(intervals);
        //遍历,下一个会议开始时间在上一个会议结束时间之前
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] < intervals[i - 1][1]){
                return false;
            }
        }
        return true;
    }

2. 合并区间

题目

LeetCode56 以数组intervals表示若干个区间集合,其中单个区间为intervals[i] = [start,endi].请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组恰好覆盖输入中的所有区间。

算法通关村17关 | 盘点面试大热门之区间问题_第2张图片

思路

遍历所有区间,判断下个区间开始是否小于上个区间结束,小于则合并,更新数组中该元素的结尾数字,

代码

    /**
     * 合并相交的区间
     * @param intervals
     * @return
     */
    public int[][] merage(int[][] intervals){
        //按区间位置进行升序排序
        Arrays.sort(intervals);
        //创建新数组用于存储合并后的
        int[][] res = new int[intervals.length][2];
        int idx = -1;
        for (int[] interval : intervals){
            //先放进第一个数组,第二个区间起始位置 > 第一个区间终止位置,说明不重叠
            if (idx == -1 || interval[0] > intervals[idx][1]){
                res[++idx] = interval;
            }else {
                //重叠,合并区间
                res[idx][1] = Math.max(res[idx][1], interval[1]);
            }
        }
        //因为idx比数组元素个数小1,所以组要+1
        return Arrays.copyOf(res, idx +1);
    }

3. 插入区间

题目

LeetCode 57 给定一个区间的集合,找到与其相交的区间,其余的区间互补重叠。

算法通关村17关 | 盘点面试大热门之区间问题_第3张图片

思路

  1. 对于给定的newinterval,先找出左边与其相交的区间,起始时间小于上个区间的结束时间的区间。
  2. 然后右边终止元素大于下个区间起始时间的所有区间。
  3. 合并相交区间。

代码

    public int[][] insert(int[][] intervals, int[] newInterval){
        int[][] res = new int[intervals.length + 1][2];
        int idx = 0;
        //遍历区间先加入左边相离的区间
        int i = 0;
        while (i < intervals.length && intervals[i][1] < newInterval[0]){
            res[idx++] = intervals[i++];
        }
        //判断终止时间,是否与右边区间重叠,重叠就合并
        while (i < intervals.length && intervals[i][0] <= newInterval[1]){
            newInterval[0] = Math.min(intervals[i][0],newInterval[0]);
            newInterval[1] = Math.max(intervals[i][0], newInterval[1]);
            i++;
        }
        res[idx++] = newInterval;
        // 右边剩余区间加入结果集
        while (i < intervals.length){
            res[idx++] = intervals[i++];
        }
        return Arrays.copyOf(res,idx);
    }

你可能感兴趣的:(算法通关村专栏,算法)