Insert Interval

来源:互联网 发布:防sql注入 编辑:程序博客网 时间:2024/06/03 16:22

题目:给出一些非重叠区间,插入一个新区间

[1,3],[6,9], 插入 [2,5] 结果为 [1,5],[6,9].

[1,2],[3,5],[6,7],[8,10],[12,16], 插入 [4,9] 结果为 [1,2],[3,10],[12,16].

思路:大致三种情况


主要注意区间范围的限制。


首先考虑两级情况,要么在最左边,要么在最右边。这种情况最简单,直接插入。

接下来就是难点,注意情况newInterval.start > intervals[i].end,是在区间进行比较。

相反newInterval.end < intervals[j].start,这是在区间左边进行比较。

也就是这个时候得出i和j,分别从左边右边得出结论。

这个时候继续判断i和j,只有两种情况。j<i以及j>=i。这个时候还得小心,究竟新区间与原来区间有没有重叠,这也是j<i的情况,剩下的很简单。


代码

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


0 0
原创粉丝点击