56. 合并区间-字节跳动高频题

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了56. 合并区间-字节跳动高频题相关的知识,希望对你有一定的参考价值。

一、题目描述

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

示例 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]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

二、解题

排序合并

先将数组按照左边界升序,然后在根据前一个数组的右边界与当前数组边界做比较,判断是否合并。

class Solution 
    public int[][] merge(int[][] intervals) 
        //将数组按照左边界递增
        //如果有重合点合并。
        List<int[]> res = new ArrayList<>();
        if(intervals == null)
            return res.toArray(new int[res.size()][2]);
        
        Arrays.sort(intervals,new Comparator<int[]>()
            public int compare(int[] a,int[] b)
                return a[0]-b[0];
            
        );

        int length = intervals.length;        
        for(int i = 0;i<length;i++)
            int left = intervals[i][0];
            int right = intervals[i][1];
            
            //往集合中添加数组 如果集合为空添加第一个数组,或者集合不为空取前一个数组的右边界和当前左边界判断
            if(res.size() == 0 || res.get(res.size()-1)[1] < left)
                res.add(new int[]left,right);
            else
                //如果上一个数组的右边界小于当前数组的右边界并且大于当前数组的左边界,等价于上一个数组的右边界在当前数组中
                //说明重合了,需要更新右边界
                res.get(res.size()-1)[1] = Math.max(res.get(res.size()-1)[1],right);
            
        
        return res.toArray(new int[res.size()][]);
    

[[1,9],[2,5],[19,20],[10,11],[12,20],[0,3],[0,1],[0,2]]

以上是关于56. 合并区间-字节跳动高频题的主要内容,如果未能解决你的问题,请参考以下文章

143. 重排链表-链表拆分+反转+合并-字节跳动高频题

33. 搜索旋转排序数组-字节跳动高频题

字节跳动高频算法题TOP100

字节跳动高频算法题TOP100

字节跳动高频算法题TOP100

字节跳动一道力扣没有的高频面试题题——排序奇升偶降链表