zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    牛客网 二叉树的镜像 JAVA
    牛客网 反转链表 JAVA
    牛客网 调整数组顺序使奇数位于偶数前面 JAVA
    Integer to Roman LeetCode Java
    Valid Number leetcode java
    Longest Common Prefix
    Wildcard Matching leetcode java
    Regular Expression Matching
    Longest Palindromic Substring
    Add Binary LeetCode Java
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3751579.html
Copyright © 2011-2022 走看看