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

    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:
    Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

    Example 2:
    Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

    This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

    56. Merge Intervals的拓展,给定一个无重叠的区间集合,以开始时间排序好了,插入一个新的区间,保证集合区间仍然有序且不重叠(如果有必要的话合并区间)。

    新建一个数组,先把结尾小于新区间开始的区间写入数组,然后对于后边的和新区间进行合并,生成新的区间,直到新区间的结束小于后边区间的开始,写入这个合并后的新区间和后边剩余的区间到新数组。还有一种做法是,这里要插入一个区间,就要比较新区间和就的区间列表中的区间,如果不需要合并,就直接插入。如果需要合并,则要合并新区间,并删除不需要的区间。

    Java:

    public class Solution {
        public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
            if (newInterval == null || intervals == null) {
                return intervals;
            }
    
            List<Interval> results = new ArrayList<Interval>();
            int insertPos = 0;
    
            for (Interval interval : intervals) {
                if (interval.end < newInterval.start) {
                    results.add(interval);
                    insertPos++;
                } else if (interval.start > newInterval.end) {
                    results.add(interval);
                } else {
                    newInterval.start = Math.min(interval.start, newInterval.start);
                    newInterval.end = Math.max(interval.end, newInterval.end);
                }
            }
    
            results.add(insertPos, newInterval);
    
            return results;
        }
    }  

    Python:

    class Solution(object):
        def insert(self, intervals, newInterval):
            result = []
            i = 0
            while i < len(intervals) and newInterval.start > intervals[i].end:
                result += intervals[i],
                i += 1
            while i < len(intervals) and newInterval.end >= intervals[i].start:
                newInterval = Interval(min(newInterval.start, intervals[i].start), 
                                       max(newInterval.end, intervals[i].end))
                i += 1
            result += newInterval,
            result += intervals[i:]
            return result
    

    Python:

    class Solution:
        def insert(self, intervals, newInterval):
            results = []
            insertPos = 0
            for interval in intervals:
                if interval.end < newInterval.start:
                    results.append(interval)
                    insertPos += 1
                elif interval.start > newInterval.end:
                    results.append(interval)
                else:
                    newInterval.start = min(interval.start, newInterval.start)
                    newInterval.end = max(interval.end, newInterval.end)
            results.insert(insertPos, newInterval)
            return results
    

    C++:

    class Solution {
    public:
        vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
            vector<Interval> res = intervals;
            int i = 0, overlap = 0, n = res.size();
            while (i < n) {
                if (newInterval.end < res[i].start) break;  
                else if (newInterval.start > res[i].end) {} 
                else {
                    newInterval.start = min(newInterval.start, res[i].start);
                    newInterval.end = max(newInterval.end, res[i].end);
                    ++overlap;
                }
                ++i;
            }
            if (overlap > 0) res.erase(res.begin() + i - overlap, res.begin() + i);
            res.insert(res.begin() + i - overlap, newInterval);
            return res;
        }
    };
    

    C++:

    class Solution {
    public:
        vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
            size_t i = 0;
            vector<Interval> result;
            // Insert intervals appeared before newInterval.
            while (i < intervals.size() && newInterval.start > intervals[i].end) {
                result.emplace_back(intervals[i++]);
            }
    
            // Merge intervals that overlap with newInterval.
            while (i < intervals.size() && newInterval.end >= intervals[i].start) {
                newInterval = {min(newInterval.start, intervals[i].start),
                    max(newInterval.end, intervals[i].end)};
                ++i;
            }
            result.emplace_back(newInterval);
    
            // Insert intervals appearing after newInterval.
            result.insert(result.end(), intervals.cbegin() + i, intervals.cend());
            return result;
        }
    };
    

      

    类似题目:

    [LeetCode] 56. Merge Intervals 合并区间

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    kubernetes实战(十六):k8s高可用集群平滑升级 v1.11.x 到v1.12.x
    kubernetes实战(十四):k8s持久化部署gitlab集成openLDAP登录
    kubernetes实战(十三):k8s使用helm持久化部署harbor集成openLDAP登录
    kubernetes实战(十二):k8s使用helm持久化部署redmine集成openLDAP
    kubernetes实战(十一):k8s使用openLDAP统一认证
    Django数据库连接Mysql配置
    HmailServer 无法发信 端口25连接失败 ConnectFail not possible to connect 请看这里
    C++ Opencv安装教程 超详细图解 Vs2015/2017/2019(C++)绑定 VisualStduio
    Python Ftp Ftplib dir()方法 返回值问题
    Collections 初识
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8512221.html
Copyright © 2011-2022 走看看