• 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!

  • 相关阅读:
    ajax翻页效果模仿yii框架
    一个伪ajax图片上传代码的例子
    php下intval()和(int)转换有哪些区别
    php中iconv函数使用方法
    php字符串截取问题
    ASP.net UrlRewrite的防盗链功能
    ASP.NET中application对象
    javascript回车完美实现tab切换功能
    有关c#装箱和拆箱知识整理
    PHP四大安全策略
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3751579.html
Copyright © 2020-2023  润新知