【Leetcode】56. Merge Intervals

news/2024/7/3 10:28:30

题目地址:

https://leetcode.com/problems/merge-intervals/

给定一列区间,合并完成后返回。

法1:排序后逐个merge。先将区间按照左端点排序,如果左端点相等就右端点小的在前面,然后从左到右扫描这些区间。每次扫描的时候,都check一下这个区间的start是不是小于上一个区间的end,如果小于,说明可以合并,这时更新end;否则说明不能合并,那就把下一个区间加进答案里。遍历完后返回。代码如下:

class Solution {
    public int[][] merge(int[][] intervals) {
        if (intervals == null || intervals.length == 0) {
            return intervals;
        }
    	// 按左端点排序,如果左端点一样就谁右端点小排前面
        Arrays.sort(intervals, (i1, i2) -> {
            if (i1[0] != i2[0]) {
                return i1[0] < i2[0] ? -1 : 1;
            } else {
                if (i1[1] != i2[1]) {
                    return i1[1] < i2[1] ? -1 : 1;
                } else {
                    return 0;
                }
            }
        });
        
        List<int[]> list = new ArrayList<>();
        list.add(intervals[0]);
        // 每次新遍历到一个区间,就尝试将其merge进list中
        for (int i = 1; i < intervals.length; i++) {
            mergeLast(list, list.get(list.size() - 1), intervals[i]);
        }
        
        int[][] res = new int[list.size()][2];
        for (int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        return res;
    }
	
	private void mergeLast(List<int[]> list, int[] last, int[] cur) {
		// 如果last和cur不相交,则直接将cur加进list;否则拓宽last右端点
        if (last[1] < cur[0]) {
            list.add(cur);
        } else {
            last[1] = Math.max(last[1], cur[1]);
        }
    }
}

时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),因为要排序,空间 O ( n ) O(n) O(n)

法2:可以开一个新的class,表示每一个区间的端点,不仅记录其坐标,也要记录一下其是否是左端点。并且对这个class规定一个偏序关系,坐标不等则坐标左者在前,否则的话是左端点者在前。容易证明这个关系确实是个偏序关系。接着对这些点排好序,然后遍历这些点,直到凑成一个“括号”(凑成一个括号的意思是,左端点的点数目和右端点相等了)的时候,说明一部分区间合并完毕,则加入最终结果中。代码如下:

import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;

public class Solution {
    class Point implements Comparable<Point> {
        int x;
        boolean isLeft;
        
        Point(int x, boolean isLeft) {
            this.x = x;
            this.isLeft = isLeft;
        }
        
        @Override
        public int compareTo(Point another) {
            if (this.x != another.x) {
                return this.x < another.x ? -1 : 1;
            }
            
            return this.isLeft ? -1 : 1;
        }
    }
    
    public int[][] merge(int[][] intervals) {
        if (intervals == null || intervals.length == 0) {
            return intervals;
        }
        
        TreeSet<Point> set = new TreeSet<>();
        for (int[] interval : intervals) {
            set.add(new Point(interval[0], true));
            set.add(new Point(interval[1], false));
        }
        
        List<int[]> list = new ArrayList<>();
        int leftCount = 0, left = Integer.MAX_VALUE;
        for (Point point : set) {
            if (point.isLeft) {
                left = Math.min(left, point.x);
                leftCount++;
            } else {
                leftCount--;
                if (leftCount == 0) {
                    list.add(new int[]{left, point.x});
                    left = Integer.MAX_VALUE;
                }
            }
        }
        
        int[][] res = new int[list.size()][2];
        for (int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        
        return res;
    }
}

时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),空间 O ( n ) O(n) O(n)


http://www.niftyadmin.cn/n/3647496.html

相关文章

SpringBoot:四年Java面试遇到的问题整理,已拿到offer

前言 今天逛论坛&#xff0c;看到了一位35岁的老程序员发的博文&#xff0c;看完内容后我又活了&#xff0c;35岁挑战华为社招&#xff0c;竟然凭实力在半个月内经历4轮面试后成功拿到了offer,不得不佩服这位大哥&#xff0c;35岁还这么强我们这些后辈还怕啥&#xff01; 当然…

图片镂空算法集合[图]

在开发界面及棋牌游戏过程中&#xff0c;需要很多镂空的图片,而且图片形式一般比较固定.所以封装了几种常见的镂空方法.1. 用于没有掩码图,只有指定透明色,不进行伸缩voidDrawTransBitmap( HDC hdcDest, //目标DCintnXOriginDest, //目标X偏移intnYOriginDest…

如何调试MFC中的内存泄漏[转帖]

首先&#xff0c;应该是MFC报告我们发现内存泄漏。注意&#xff1a;要多运行几次&#xff0c;以确定输出的内容不变&#xff0c;特别是{}之间的数值&#xff0c;不能变&#xff0c;否则下面的方法就不好用了。我们来看看&#xff1a;F:/CodeSample/Test/TestPipe/LeakTest/Main…

Spring事务是如何传播的?真香系列

前言 互联网时代&#xff0c;瞬息万变。一个小小的走错&#xff0c;就有可能落后于别人。我们没办法去预测任何行业、任何职业未来十年会怎么样&#xff0c;因为未来谁都不能确定。只能说只要有互联网存在&#xff0c;程序员依然是个高薪热门行业。只要跟随着时代的脚步&#…

【Leetcode】739. Daily Temperatures

题目地址&#xff1a; https://leetcode.com/problems/daily-temperatures/ 题目大意是&#xff0c;对于数组中每个数字&#xff0c;找出右边第一个比它大的数字&#xff0c;记录下标的差最后返回。典型单调栈的应用。维护一个单调下降的栈&#xff0c;如果栈空或者栈顶大于等…

DLL(Dynamic Link Libraries)专题[转帖]

原帖地址:http://www.microsoft.com/china/community/program/originalarticles/techdoc/dll.mspxDLL(Dynamic Link Libraries)专题目录引言 调用方式 MFC中的DLL DLL入口函数 关于约定 关于DLL的函数 模块定义文件(.DEF) DLL程序和调用其输出函数的程序的关系 作者引言比较大的…

【Leetcode】704. Binary Search

题目地址&#xff1a; https://leetcode.com/problems/binary-search/ 给定一个长nnn的升序数组AAA&#xff0c;返回某个给定数ttt的下标&#xff0c;如果不存在则返回−1-1−1。 二分。代码如下&#xff1a; class Solution {public:int search(vector<int>& a, …

Spring是怎样巧用三级缓存解决循环依赖的?灵魂拷问

前言 目前绝大部分的Java程序员都是处于增删改查的阶段&#xff0c;但是到了这个阶段后就应该考虑下一个层次的突破了&#xff0c;总不能做一辈子的crud吧… **以目前IT行业的发展趋势以及就业情况来看&#xff0c;**市场早已经不缺初级开发了&#xff0c;对于中高级开发人才…