Insert Interval
生活随笔
收集整理的這篇文章主要介紹了
Insert Interval
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Insert Interval 題解
題目描述
即向有序、不重疊的區間序列中插入一個區間。如區間產生重疊,則合并。求插入新區間后的區間序列。
如:A = [1,3],[6,9],插入[2,6],插入后新序列為[1,9]。
題解
由于序列有序,利用二分查找可在O(log N)時間內找到待插入區間的位置區間,而后合并區間即刪除插入后產生的的重疊區間,由于是在數組上進行刪除操作,時間復雜度為O(N)。即總體時間復雜度為O(N),空間復雜度為O(1)。
代碼
typedef std::vector<Interval> ParamType; bool cmpStart(const Interval& a, const Interval& b) {return a.start > b.start; } bool cmpEnd(const Interval& a, const Interval& b) {return a.end < b.end; } class Solution { public:vector<Interval>& insert(vector<Interval>& intervals, Interval newInterval) {ParamType::reverse_iterator start(std::lower_bound(intervals.rbegin(), intervals.rend(), newInterval, cmpStart));ParamType::iterator end(std::upper_bound(intervals.begin(), intervals.end(), newInterval, cmpEnd));if (start != intervals.rend() && newInterval.start <= start->end) {if (end != intervals.end() && newInterval.end >= end->start) {start->end = end->end;intervals.erase(intervals.begin() + (intervals.size() - (start - intervals.rbegin())), end + 1);} else {start->end = newInterval.end;intervals.erase(intervals.begin() + (intervals.size() - (start - intervals.rbegin())), end);}} else {if (end != intervals.end() && newInterval.end >= end->start) {end->start = newInterval.start;intervals.erase(intervals.begin() + (intervals.size() - (start - intervals.rbegin())), end);} else {ParamType::iterator in = intervals.begin() + (intervals.size() - (start - intervals.rbegin()));if (in != end) {*in = newInterval;intervals.erase(in + 1, end);} else {intervals.insert(in, newInterval);}}}return intervals;} };總結
主要應用了二分查找的思想。
總結
以上是生活随笔為你收集整理的Insert Interval的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android下的数据存储与访问、权限
- 下一篇: ZABBIX3.0配置邮件报警