• LeetCode 57. Insert Interval


    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

    You may assume that the intervals were initially sorted according to their start times.

    Example 1:
    Given intervals[1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

    Example 2:
    Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

    This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

    按照上一题的方法,时间复杂度O(N*log(N))

    • 将给定区间push_back到整体区间;
    • 然后排序,然后按照上一题的方法过一遍就可以了。
    /**
     * Definition for an interval.
     * struct Interval {
     *     int start;
     *     int end;
     *     Interval() : start(0), end(0) {}
     *     Interval(int s, int e) : start(s), end(e) {}
     * };
     */
     bool cmp(const Interval &a, const Interval &b)
     {
         return a.start < b.start;
     }
    class Solution {
    public:
        vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
            intervals.push_back(newInterval);
            sort(intervals.begin(),intervals.end(), cmp);
    
            vector<Interval> ans;
    
            int b = intervals[0].start, e = intervals[0].end;
            for(int i=1; i<intervals.size(); ++ i)
            {
                if(intervals[i].start > e)
                {
                    ans.push_back(Interval(b, e));
                    b = intervals[i].start, e = intervals[i].end;
                }
                else
                {
                    if(intervals[i].end > e)
                        e = intervals[i].end;
                }
            }
            ans.push_back(Interval(b, e));
            return ans;
        }
    };
    

    利用数组有序,时间复杂度O(n)

    • 每次比较给定区间的起始位置和当前期间的起始位置
    • 根据起始位置的大小,选取起始位置小的区间
    • 判断两个区间是否有交叉。有的话,当前区间往后挪动,直到没有交叉。然后break
    • 将剩下的区间加入答案中。
    /**
     * Definition for an interval.
     * 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)
                return vector<Interval>{newInterval, };
            
            vector<Interval> ans;
            int b, e, i;
            bool used = false;
            for(i=0; i<intervals.size(); ++ i)
            {
                if(intervals[i].start <= newInterval.start)
                {
                    b = intervals[i].start, e = intervals[i].end;
                    if(newInterval.start <= e)
                    {
                        used = true;
                        e = max(e, newInterval.end);
                        while(i+1 < intervals.size() && intervals[i+1].start <= e)
                            i ++;
                        e = max(e, intervals[i].end);
                        i ++;
                    }
                }
                else
                {
                    used = true;
                    b = newInterval.start, e = newInterval.end;
                    if(newInterval.end >= intervals[i].start)
                    {
                        e = max(e, intervals[i].end);
                        while(i+1 < intervals.size() && intervals[i+1].start <= e)
                            i ++;
                        e = max(e, intervals[i].end);
                        i ++;
                    }
                }
                ans.push_back(Interval(b, e));
                if(used)
                    break;
            }
            if(used == false)
                ans.push_back(newInterval);
            else
                for(; i<intervals.size(); ++ i)
                    ans.push_back(intervals[i]);
            return ans;
        }
    };
    
  • 相关阅读:
    iOS的一些面试题分析总结(1)
    iOS的一些面试题分析总结(0)
    iOS页面间传值的一些方式总结
    自定义UIButton
    iOS查看3D效果的手势交互
    关于php得到参数数据
    ios安装ipa与安卓安装apk
    听说程序员想当就能当?
    W5100S、W5500、W5100差异对比
    annot read lifecycle mapping metadata for artifact org.apache.maven.plugins:maven-clean-plugin:maven
  • 原文地址:https://www.cnblogs.com/aiterator/p/6674230.html
Copyright © 2020-2023  润新知