Leetcode 56. 合并区间(排序 + sort 方法的注意)

这篇具有很好参考价值的文章主要介绍了Leetcode 56. 合并区间(排序 + sort 方法的注意)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • Leetcode 56. 合并区间(排序 + sort 方法的注意)
  • 题目
    • 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。
    • 请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
    • 1 <= intervals.length <= 10^4
    • intervals[i].length == 2
    • 0 <= starti <= endi <= 10^4
  • 解法
    • 排序 + 遍历:排序第一维升序、第二维升序降序均可,遍历数组将第一个元素 starti 放入 start、endi 放入 end,对比 end 与下一个元素的 starti,
      • 如果 end 小于 starti,代表下一个元素为下一个区间,start 与 end 放入结果,重新赋值为下一个元素
      • 如果 end 大于等于 starti,代表俩区间有重叠,更新 end、取 end 与 endi 的最大值,即当前合并后区间最右端点
    • 直到数组遍历结束,将最后的 start、end 放入结果,
    • 解释:第一维升序后,每次遍历一定是当前剩余元素的最小 starti
    • 时间复杂度:O(nlogn)排序复杂度,空间复杂度:O(n)最后存储结果需要集合转数组
    • 在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性,不然 Arrays.sort,Collections.sort 会抛出 IllegalArgumentException 异常
      • 自反性:两个相同的元素相比时,compare 必须返回0,也就是 compare(o1, o1) = 0
      • 反对称性:如果 compare(o1,o2) = 1,则 compare(o2, o1) 必须返回符号相反的值也就是 -1
      • 传递性:如果 a>b, b>c, 则 a 必然大于 c。也就是 compare(a,b)>0, compare(b,c)>0, 则 compare(a,c)>0
  • 代码
    /**
     * 排序 + 遍历:排序第一维升序、第二维升序降序均可,遍历数组将第一个元素 starti 放入 start、endi 放入 end,对比 end 与下一个元素的 starti,
     *     如果 end 小于 starti,代表下一个元素为下一个区间,start 与 end 放入结果,重新赋值为下一个元素
     *     如果 end 大于等于 starti,代表俩区间有重叠,更新 end、取 end 与 endi 的最大值,即当前合并后区间最右端点
     * 直到数组遍历结束,将最后的 start、end 放入结果,
     * 解释:第一维升序后,每次遍历一定是当前剩余元素的最小 starti
     * 时间复杂度:O(nlogn)排序复杂度,空间复杂度:O(n)最后存储结果需要集合转数组
     *
     * 在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性,不然 Arrays.sort,Collections.sort 会抛出 IllegalArgumentException 异常
     *     自反性:两个相同的元素相比时,compare 必须返回0,也就是 compare(o1, o1) = 0
     *     反对称性:如果 compare(o1,o2) = 1,则 compare(o2, o1) 必须返回符号相反的值也就是 -1
     *     传递性:如果 a>b, b>c, 则 a 必然大于 c。也就是 compare(a,b)>0, compare(b,c)>0, 则 compare(a,c)>0
     */
    private int[][] solution(int[][] intervals) {
        // 判空
        if (intervals == null || intervals.length <= 0 || intervals[0] == null || intervals[0].length <= 0) {
            return new int[0][0];
        }

        // 排序第一维升序、第二维升序
//        Arrays.sort(intervals, new Comparator<int[]>() {
//            @Override
//            public int compare(int[] interval1, int[] interval2) {
//                return interval1[0] - interval2[0];
//            }
//        });
        sortIntervals(intervals);
//        AlgorithmUtils.systemOutArray(intervals);

        // 遍历放入结果
        return doMerge(intervals);
    }

    /**
     * 排序第一维升序、第二维升序
     */
    private void sortIntervals(int[][] intervals) {
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[0] > o2[0]) {
                    return 1;
                } else if (o1[0] < o2[0]) {
                    return -1;
                } else {
                    if (o1[1] > o2[1]) {
                        return 1;
                    } else if (o1[1] < o2[1]) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
            }
        });
    }

    /**
     * 遍历返回结果
     */
    private int[][] doMerge(int[][] intervals) {
        int start = intervals[0][0];
        int end = intervals[0][1];

        List<String> resList = new ArrayList<>();
        int len = intervals.length;
        for (int i = 1; i < len; i++) {
            if (end < intervals[i][0]) {

                resList.add(start + "_" + end);
                start = intervals[i][0];
                end = intervals[i][1];
            } else {

                end = Math.max(end, intervals[i][1]);
            }
        }
        resList.add(start + "_" + end);

        return resList.stream()
                .map(l -> IntStream.of(Integer.valueOf(l.split("_")[0]), Integer.valueOf(l.split("_")[1])).toArray())
                .toArray(int[][]::new);
    }

文章来源地址https://www.toymoban.com/news/detail-494877.html

到了这里,关于Leetcode 56. 合并区间(排序 + sort 方法的注意)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode 36天 | 435.无重叠区域 763.划分字母区间 56.合并区间

    435. 无重叠区间 左边排序,右边裁剪为当前最小的 763. 划分字母区间 自己写出来的题,虽然之前做过一遍了。 自己的写法虽然比较难看,但是也列出来了。 再给一个卡尔的写法 56. 合并区间 重叠区域的题目大都要按左边界先排序。学了个lambda表达式。可以直接将一个区域放

    2024年02月20日
    浏览(80)
  • 【算法之贪心算法IV】leetcode56. 合并区间

    力扣题目链接 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中 points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend 之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭

    2024年02月11日
    浏览(57)
  • LeetCode每日一题:56. 合并区间(2023.8.27 C++)

    目录 56. 合并区间 题目描述: 实现代码与解析: 排序 + 贪心 原理思路:         以数组  intervals  表示若干个区间的集合,其中单个区间为  intervals[i] = [starti, endi]  。请你合并所有重叠的区间,并返回  一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间  。

    2024年02月11日
    浏览(42)
  • 算法训练day36|贪心算法 part05(重叠区间三连击:LeetCode435. 无重叠区间763.划分字母区间56. 合并区间)

    题目链接🔥🔥 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区

    2024年02月09日
    浏览(62)
  • 【LeetCode题目详解】第八章 贪心算法 part05 435. 无重叠区间 763.划分字母区间 56. 合并区间 (day36补)

    给定一个区间的集合  intervals  ,其中 intervals[i] = [starti, endi]  。返回 需要移除区间的最小数量,使剩余区间互不重叠  。 示例 1: 示例 2: 示例 3: 提示: 1 = intervals.length = 105 intervals[i].length == 2 -5 * 104 = starti  endi = 5 * 104 相信很多同学看到这道题目都冥冥之中感觉要排序,但

    2024年02月11日
    浏览(51)
  • 力扣 56. 合并区间

    题目来源:https://leetcode.cn/problems/merge-intervals/description/  C++题解:根据左区间排序,更新每一段的右区间最大值,直到间断。 同思路,另一种写法(代码随想录)。

    2024年02月16日
    浏览(41)
  • 【算法详解】力扣56.合并区间

    力扣链接:力扣56.合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [start, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入: intervals = [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,1

    2024年01月19日
    浏览(35)
  • 【每日一题】56. 合并区间

    以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 示例 2: 提示: 1 = intervals.length = 104 intervals[i].length == 2 0 = starti = endi = 104 首先将所

    2024年02月10日
    浏览(36)
  • Leecode56:合并区间(贪心算法)

    第一眼看到这个题目觉得应该是比较第一个值的大小,因为如果第n个值比n-1个值的右边还小于等于,那么说明区间可以连起来。但是不会写比较强!! Arrays.sort()函数里, Arrays.sort(shuzu, Comparatorint[](){ }); 千万记得排序后分清楚哪个是原本的哪个是当前的!!以及新加一个

    2024年02月07日
    浏览(46)
  • DAY35 435. 无重叠区间 + 763.划分字母区间 + 56. 合并区间

    题目要求:给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包