日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Insert Interval

發布時間:2025/4/16 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。