https://oj.leetcode.com/problems/insert-interval/
给出有序的区间来,再插入进去一个,也就是区间合并。
刚开始确立了几个思路,看要插入的区间的start和end分别位于什么位置。区分是在空闲处还是在一个区间里面,并且还要判断跨越了几个区间,并且要进行数组元素的后移之类的。写了代码比较麻烦,于是想新的思路。如下:新建立一个数组,这样从前往后扫描老数组和要插入元素的关系,如果还没到插入元素,则正常将老数组元素复制到新数组里面,如果到了要插入的元素,则开始看,哪个begin更小,则用哪个,之后再while循环,一直到找到end的关系。当处理完要插入的元素后,剩下的全部拷贝到新数组中。在思考的过程中,在纸上画出所有位置相关可能的情况。
1.要插入的元素完整在本次处理元素的左边,则插入要插入的元素,并且相当于处理完了。
2.要插入的元素完整在本次处理元素的右边,则继续往后扫描。
3.要插入元素在一个区间的里面,相当于处理完了,不用插入。
4.其他位置关系,则要找到开始位置,然后再处理结束位置。
#include <iostream> #include <vector> using namespace std; 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) { if(intervals.size()==0 ||newInterval.start>intervals[intervals.size()-1].end) { intervals.push_back(newInterval); return intervals; } vector<Interval> intervals_ans; bool flag_finish = false; for(unsigned int i = 0;i < intervals.size();i++) { if(flag_finish == false) { if(intervals[i].start > newInterval.end) { intervals_ans.push_back(newInterval); flag_finish = true; } else if(intervals[i].end < newInterval.start) intervals_ans.push_back(intervals[i]); else if(intervals[i].start<=newInterval.start && intervals[i].end >= newInterval.end) flag_finish = true; else { int newbegin; int newend; if(intervals[i].start>=newInterval.start) newbegin = newInterval.start; else if(intervals[i].start<newInterval.start) newbegin = intervals[i].start; unsigned int j = i + 1; while(j< intervals.size() && intervals[j].start<=newInterval.end) j++; if(intervals[j-1].end <= newInterval.end) newend = newInterval.end; else if(intervals[j-1].end > newInterval.end) newend = intervals[j-1].end; Interval in; in.start = newbegin; in.end = newend; intervals_ans.push_back(in); i = j; flag_finish = true; } } if(flag_finish == true && i<intervals.size()) intervals_ans.push_back(intervals[i]); } return intervals_ans; } }; int main() { Interval i1(1,3); Interval i2(6,9); vector<Interval> intervals; intervals.push_back(i1); intervals.push_back(i2); Interval i(3,6); Solution myS; myS.insert(intervals,i); return 0; }
另外get了一点,要处理warning:
程序执行的时候,在insert函数调用后就崩了,在vector的析构函数中“
> ConsoleApplication3.exe!std::vector<Interval,std::allocator<Interval> >::~vector<Interval,std::allocator<Interval> >() 行 901 C++
”即发生了内存泄露,在最后清理的时候挂了。
函数执行前有如下warning信息:
1>d:documentsvisual studio 2012projectsconsoleapplication3consoleapplication3源.cpp(23): warning C4018: “<”: 有符号/无符号不匹配 1>d:documentsvisual studio 2012projectsconsoleapplication3consoleapplication3源.cpp(46): warning C4018: “<”: 有符号/无符号不匹配 1>d:documentsvisual studio 2012projectsconsoleapplication3consoleapplication3源.cpp(64): warning C4715: “Solution::insert”: 不是所有的控件路径都返回值
于是,把warning都解决了,发现原来没有写最后的 “return intervals_ans;” ,加上就好了。
以后不可以无视 warning!