zoukankan      html  css  js  c++  java
  • LeetCode 57. Insert Interval 插入区间 (C++/Java)

    题目:

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

    You may assume that the intervals were initially sorted according to their start times.

    Example 1:

    Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
    Output: [[1,5],[6,9]]
    

    Example 2:

    Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
    Output: [[1,2],[3,10],[12,16]]
    Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].

    NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.

    分析:

    给定一个无重叠的,已排序的区间集合,要求在集合中插入一个新的区间,保证插入后区间无重叠且有序。

    LeetCode 56. Merge Intervals 合并区间 (C++/Java)的进阶,我们可以利用56题的解法来解决这道题,也就是在原列表中按序将新区间插入,然后再进行区间合并。

    此外我们还可以将原集合区间分为三部分,一部分是右端点小于新区间左端点,一部分是左端点大于新区间右端点,这两部分区间不会和新区间发生合并,剩下的区间则需要和新区间合并,遍历完所有区间后,将三部分合并即可。

    C++采用插入排序合并,Java采用分区合并

    程序:

    C++

    class Solution {
    public:
        vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
            auto it = intervals.begin();
            while(it != intervals.end() && (*it)[0] < newInterval[0])
                it++;
            intervals.insert(it, newInterval);
            vector<vector<int>> res;
            for(auto interval:intervals){
                if(res.empty())
                    res.push_back(interval);
                else if(res.back()[1] < interval[0])
                    res.push_back(interval);
                else{
                    auto t = res.back();
                    res.pop_back();
                    res.push_back({t[0], max(t[1], interval[1])});
                }
            }
            return res;
                
        }
    };

    Java

    class Solution {
        public int[][] insert(int[][] intervals, int[] newInterval) {
    
            int start = newInterval[0];
            int end = newInterval[1];
            List<int[]> l = new ArrayList<>();
            List<int[]> r = new ArrayList<>();
            for(int[] interval:intervals){
                if(interval[1] < start){
                    l.add(interval);
                }else if(end < interval[0]){
                    r.add(interval);
                }else{
                    start = Math.min(start, interval[0]);
                    end = Math.max(end, interval[1]);
                }
            }
            l.add(new int[]{start, end});
            l.addAll(r);
            return l.toArray(new int[l.size()][]);
        }
    }
  • 相关阅读:
    在python中处理XML
    正则表达式
    python 反射
    python模块概况,json/pickle,time/datetime,logging
    python装饰器
    python3内置函数详解
    python函数,lambda表达式,三目运算,列表解析,递归
    python数据类型及其常用方法
    python3的文件操作
    初识Docker
  • 原文地址:https://www.cnblogs.com/silentteller/p/12366666.html
Copyright © 2011-2022 走看看