LeetCode OJ--Insert Interval **

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!

原文地址:https://www.cnblogs.com/qingcheng/p/3751579.html