【合并区间】

简介: 【合并区间】

正文


一、题目描述#


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

示例 1:


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


示例 2:


输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。


二、代码#


class Solution {
        public int[][] merge(int[][] intervals) {
        List<int[]> list = new ArrayList<>();
        //循环循环遍历我的
        if (null == intervals || intervals.length < 1) {
            return new int[0][];
        } else {
            qSort(intervals, 0, intervals.length - 1);
            int[] temp = intervals[0];
            for (int i = 1; i < intervals.length; i++) {
                if (intervals[i][0] <= temp[1]) {
                    temp[1] = intervals[i][1] > temp[1] ? intervals[i][1] : temp[1];
                } else {
                    list.add(temp);
                    temp = intervals[i];
                }
            }
            if (list.size() > 0) {
                if (list.get(list.size() - 1)[1] < temp[0]) {
                    list.add(temp);
                }else {
                    int[] ints = list.get(list.size() - 1);
                    list.remove(list.size() - 1);
                    ints[1]=ints[1] > temp[1] ? ints[1] : temp[1];
                    list.add(ints);
                }
            } else {
                list.add(temp);
            }
            int[][] returnArr = new int[list.size()][];
            for (int i = 0; i < returnArr.length; i++) {
                returnArr[i] = list.get(i);
            }
            return returnArr;
        }
    }
    private void qSort(int[][] arr, int l, int r) {
        int partition = getPartition(arr, l, r);
        if (-1 != partition) {
            qSort(arr, l, partition - 1);
            qSort(arr, partition + 1, r);
        }
    }
    private int getPartition(int[][] arr, int l, int r) {
        if (r - l < 1) {
            return -1;
        } else {
            int[] temp = arr[l];
            while (l < r) {
                while (l < r && arr[r][0] >= temp[0]) r--;
                arr[l] = arr[r];
                while (l < r && arr[l][0] <= temp[0]) l++;
                arr[r] = arr[l];
            }
            arr[r] = temp;
            return r;
        }
    }
}


三、解题思路#


首先用快速排序给我们的数组排序。之后,再进行合并我们的候选数组。

相关文章
|
8天前
|
算法 测试技术 C#
C++二分查找算法:包含每个查询的最小区间
C++二分查找算法:包含每个查询的最小区间
|
8天前
|
C++ Python
leetcode-56:合并区间
leetcode-56:合并区间
38 0
|
2天前
力扣56.合并区间
力扣56.合并区间
|
8天前
|
存储 C++
合并两个有序数组(C++)
合并两个有序数组(C++)
46 0
|
10月前
有序序列合并
有序序列合并
47 0
|
9月前
|
存储 搜索推荐
合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
46 0
7-174 两个有序链表序列的合并
7-174 两个有序链表序列的合并
50 0
|
存储
6-1 两个有序链表序列的合并
6-1 两个有序链表序列的合并
86 0
合并两个链表(自定义位置合并与有序合并)LeetCode--OJ题详解
给两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。 请你将 list1 中 下标从 a 到 b 的全部节点都删除,并将list2 接在被删除节点 的位置。
46 0
|
存储
LeetCode 56. 合并区间
LeetCode 56. 合并区间
52 0

热门文章

最新文章