Insert Interval Array

来源:互联网 发布:软件体系架构 pdf 编辑:程序博客网 时间:2024/05/23 13:11

思路:

方法一:
类似上一题思想,不断合并,标记,最后在排序,写的很烂。
Runtime Error
原因应该是爆栈了。

void quick_sort(vector<Interval> &array, int left, int right) {    if(left < right) {        int i = left, j = right;        Interval x = array[i];        while(i < j) {            while(i < j && array[j].start >= x.start) {                --j;            }            if(i < j) {                swap(array[i], array[j]);                ++i;            }            while(i < j && array[i].start < x.start) {                ++i;            }            if(i < j) {                swap(array[i], array[j]);                --j;            }        }        array[i] = x;        quick_sort(array, left, i - 1);        quick_sort(array, i + 1, right);    }}void clear(Interval &x) {    x.start = 1;    x.end = 0;}vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {    int n = intervals.size();    vector<Interval> ans;    for(int i = 0; i < n; ++i) {        if(newInterval.start > intervals[i].end || newInterval.end < intervals[i].start) {            continue;        }        if(newInterval.start == intervals[i].end) {            newInterval.start = intervals[i].start;            clear(intervals[i]);        }else if(newInterval.end == intervals[i].start) {            newInterval.end = intervals[i].end;            clear(intervals[i]);        }else {            newInterval.start = min(newInterval.start, intervals[i].start);            newInterval.end = max(newInterval.end, intervals[i].end);            clear(intervals[i]);        }    }    //delete    for(int i = 0; i < n; ++i) {        if(!(intervals[i].start == 1 && intervals[i].end == 0)) {            ans.push_back(intervals[i]);        }    }    ans.push_back(newInterval);    show(ans);    quick_sort(ans, 0, n - 1);    return ans;}

要利用好原array已经排序好的事实。

方法二:TLE。

看到没pass的数据为:

intervals : [1,2],[2,3],[3,4],[4,5],....,[19999,20000]newInterval : [0,20001]

这样就会一直走if…else…的第三个分支,会不停的erase数组。

时间复杂度O(N),空间复杂度O(1)。

/** * Definition for an interval. * struct Interval { *     int start; *     int end; *     Interval() : start(0), end(0) {} *     Interval(int s, int e) : start(s), end(e) {} * }; */class Solution {public:    vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {        vector<Interval>::iterator it = intervals.begin();        while(it != intervals.end()) {            if(newInterval.end < it->start) {                intervals.insert(it, newInterval);                return intervals;            }else if(newInterval.start > it->end) {                it++;                continue;            }else {                newInterval.start = min(it->start, newInterval.start);                newInterval.end = max(it->end, newInterval.end);                it = intervals.erase(it);            }        }        intervals.insert(intervals.end(), newInterval);        return intervals;    }};

方法三:

相比方法二,它用空间换时间。如果遇到上一方法没pass的数据集,只记录变化,最后才往结果集里加入。

/** * Definition for an interval. * struct Interval { *     int start; *     int end; *     Interval() : start(0), end(0) {} *     Interval(int s, int e) : start(s), end(e) {} * }; */class Solution {public:    vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {        vector<Interval> res;        int n = intervals.size();        for(int i = 0; i < n; ++i) {            if(newInterval.end < intervals[i].start) {                res.push_back(newInterval);                res.insert(res.end(), intervals.begin() + i, intervals.end());                return res;            }else if(newInterval.start > intervals[i].end) {                res.push_back(intervals[i]);            }else {                newInterval.start = min(newInterval.start, intervals[i].start);                newInterval.end = max(newInterval.end, intervals[i].end);            }        }        res.push_back(newInterval);        return res;    }};
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝拉粑粑干硬怎么办 美国办新生儿护照怎么办 怀孕拉绿色大便怎么办 幼儿园孩子不爱学习怎么办 幼儿园老师管不住孩子怎么办 手机支架夹不住怎么办 画水彩没有留白液怎么办 水彩颜料脱胶了怎么办 指甲油涂到手上怎么办 抖音里没有控雨怎么办 qq视频没有特效怎么办 组长刁难员工员工怎么办 想转行没精力怎么办 桔子树无法退款怎么办 保温箱婴儿哭了怎么办 宝宝不爱吃肉泥怎么办 苹果x卡死了怎么办 苹果6手机用着卡怎么办 二个月宝宝肚子胀气怎么办 一岁半宝宝大便干结怎么办 婴儿上大便费劲怎么办 宝宝便秘半年了怎么办 1岁宝宝便秘怎么办 两个月积食了怎么办 婴儿拉青色大便怎么办 一周岁宝宝便秘怎么办 两岁宝宝内火重怎么办 一岁宝宝内火重怎么办 小孩大便有点血怎么办 一岁半宝宝拉血怎么办 宝宝八个月便秘怎么办 七个月孩子便秘怎么办 小孩肚子胀气怎么办消化不良 骨盆窄孩子卡住怎么办 孕38周便秘怎么办 孕晚期肚子发硬怎么办 小孩脸上有斑怎么办 肚子胀怎么办快速解决 肚子发撑发胀怎么办 怀孕超过40周怎么办 练琴近视了怎么办