zoukankan      html  css  js  c++  java
  • [LeetCode] 57. 插入区间

    题目链接 : https://leetcode-cn.com/problems/insert-interval/

    题目描述:

    给出一个无重叠的 ,按照区间起始端点排序的区间列表。

    在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

    示例:

    示例 1:

    输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
    输出: [[1,5],[6,9]]
    

    示例 2:

    输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
    输出: [[1,2],[3,10],[12,16]]
    解释: 这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
    

    思路:

    先考虑三种极端情况

    1. intervals为空
    2. newInterval[1] < intervals[0][0],直接插入第一个位置
    3. newInterval[0] > intervals[-1][1],直接插入最后一个位置

    下面就要考虑重叠情况了

    我们目标就是找到和newInterval相关那几个区间.

    首先,左边,当newInterval[0] > intervals[i][1]说明没有和该区间没有重叠部分,继续遍历下一个区间,比如intervals = [[1,3],[6,9]], newInterval = [2,5]

    然后,再看右边,这里有个情况,就是 当intervals[i][0] > newInterval[1]说明newInterval没有和任何区间重合,比如intervals = [[1,3],[6,9]], newInterval = [4,5],直接插入即可.

    接下来我们要找右边重合区域,当while i < n and newInterval[1] >= intervals[i][0]说明有重叠部分,记录左边最大值!

    最后把数组拼接一下即可!

    上面就是我们思考过程,

    接下来我们可以把过程简化,直接看代码,很好理解的


    关注我的知乎专栏,了解更多的解题技巧,大家共同进步!

    代码:

    复杂版:

    class Solution:
        def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
            if not intervals: return [newInterval]
            if newInterval[1] < intervals[0][0]: return [newInterval] + intervals
            if newInterval[0] > intervals[-1][1]: return intervals + [newInterval]
            i = 0
            n = len(intervals)
            while i < n and newInterval[0] > intervals[i][1]:
                i += 1
            left = min(intervals[i][0], newInterval[0])
            tmp = i
            if intervals[i][0] > newInterval[1]:
                return intervals[:tmp] + [newInterval] + intervals[tmp:]
            #print(tmp)
            right = newInterval[1]
            while i < n and newInterval[1] >= intervals[i][0]:
                right = max(right, intervals[i][1])
                i += 1
            #print(i)
            return intervals[:tmp] + [[left, right]] + intervals[i:]
    

    简化版

    class Solution:
        def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
            i = 0 
            n = len(intervals)
            res = []
            # 找左边重合区域
            while i < n and newInterval[0] > intervals[i][1]:
                res.append(intervals[i])
                i += 1
            tmp = [newInterval[0], newInterval[1]]
            # 找右边重合区域
            while i < n and newInterval[1] >= intervals[i][0]:
                tmp[0] = min(tmp[0], intervals[i][0])
                tmp[1] = max(tmp[1], intervals[i][1])
                i += 1
            res.append(tmp)
            while i < n :
                res.append(intervals[i])
                i += 1
            return res
    

    java

    class Solution {
        public int[][] insert(int[][] intervals, int[] newInterval) {
           List<int[]> res = new ArrayList<>();
            int i = 0;
            while (i < intervals.length && newInterval[0] > intervals[i][1]) {
                res.add(intervals[i]);
                i++;
            }
            int[] tmp = new int[]{newInterval[0], newInterval[1]};
            while (i < intervals.length && newInterval[1] >= intervals[i][0]) {
                tmp[0] = Math.min(tmp[0], intervals[i][0]);
                tmp[1] = Math.max(tmp[1], intervals[i][1]);
                i++;
            }
            res.add(tmp);
            while (i < intervals.length) {
                res.add(intervals[i]);
                i++;
            }
            return res.toArray(new int[0][]); 
        }
    }
    
  • 相关阅读:
    测试流程规范系列(5):BUG提交
    测试流程规范系列(6):测试报告
    测试流程规范系列(7):测试准出
    安全测试系列(1):基本概念
    Linux系列(1):常用命令
    Linux——常用命令详解
    Ant——ant的使用
    java——XML与java对象装换
    SpringMVC——form标签的使用
    SpringMVC案例1——对User表进行CRUD操作
  • 原文地址:https://www.cnblogs.com/powercai/p/10903026.html
Copyright © 2011-2022 走看看