Insert Interval Array

原创 2015年07月06日 21:47:29

思路:

方法一:
类似上一题思想,不断合并,标记,最后在排序,写的很烂。
Runtime Error
原因应该是爆栈了。

void quick_sort(vector<Interval> &array, int left, int right) {
    if(left < right) {
        int i = left, j = right;
        Interval x = array[i];
        while(i < j) {
            while(i < j && array[j].start >= x.start) {
                --j;
            }
            if(i < j) {
                swap(array[i], array[j]);
                ++i;
            }
            while(i < j && array[i].start < x.start) {
                ++i;
            }
            if(i < j) {
                swap(array[i], array[j]);
                --j;
            }
        }
        array[i] = x;
        quick_sort(array, left, i - 1);
        quick_sort(array, i + 1, right);
    }
}
void clear(Interval &x) {
    x.start = 1;
    x.end = 0;
}
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
    int n = intervals.size();
    vector<Interval> ans;
    for(int i = 0; i < n; ++i) {
        if(newInterval.start > intervals[i].end || newInterval.end < intervals[i].start) {
            continue;
        }
        if(newInterval.start == intervals[i].end) {
            newInterval.start = intervals[i].start;
            clear(intervals[i]);
        }else if(newInterval.end == intervals[i].start) {
            newInterval.end = intervals[i].end;
            clear(intervals[i]);
        }else {
            newInterval.start = min(newInterval.start, intervals[i].start);
            newInterval.end = max(newInterval.end, intervals[i].end);
            clear(intervals[i]);
        }
    }
    //delete
    for(int i = 0; i < n; ++i) {
        if(!(intervals[i].start == 1 && intervals[i].end == 0)) {
            ans.push_back(intervals[i]);
        }
    }
    ans.push_back(newInterval);
    show(ans);
    quick_sort(ans, 0, n - 1);
    return ans;
}

要利用好原array已经排序好的事实。

方法二:TLE。

看到没pass的数据为:

intervals : [1,2],[2,3],[3,4],[4,5],....,[19999,20000]
newInterval : [0,20001]

这样就会一直走if…else…的第三个分支,会不停的erase数组。

时间复杂度O(N),空间复杂度O(1)。

/**
 * 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) {
        vector<Interval>::iterator it = intervals.begin();
        while(it != intervals.end()) {
            if(newInterval.end < it->start) {
                intervals.insert(it, newInterval);
                return intervals;
            }else if(newInterval.start > it->end) {
                it++;
                continue;
            }else {
                newInterval.start = min(it->start, newInterval.start);
                newInterval.end = max(it->end, newInterval.end);
                it = intervals.erase(it);
            }
        }
        intervals.insert(intervals.end(), newInterval);
        return intervals;
    }
};

方法三:

相比方法二,它用空间换时间。如果遇到上一方法没pass的数据集,只记录变化,最后才往结果集里加入。

/**
 * 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) {
        vector<Interval> res;
        int n = intervals.size();
        for(int i = 0; i < n; ++i) {
            if(newInterval.end < intervals[i].start) {
                res.push_back(newInterval);
                res.insert(res.end(), intervals.begin() + i, intervals.end());
                return res;
            }else if(newInterval.start > intervals[i].end) {
                res.push_back(intervals[i]);
            }else {
                newInterval.start = min(newInterval.start, intervals[i].start);
                newInterval.end = max(newInterval.end, intervals[i].end);
            }
        }
        res.push_back(newInterval);
        return res;
    }
};

LeetCode[Array]: Insert Interval

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa...
  • chfe007
  • chfe007
  • 2014年12月08日 23:44
  • 466

LeetCode --- 57. Insert Interval

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa...
  • makuiyu
  • makuiyu
  • 2015年03月14日 23:10
  • 1312

Insert Interval -- LeetCode

原题链接: http://oj.leetcode.com/problems/insert-interval/  这道题跟Merge Intervals很类似,都是关于数据结构interval的操...
  • linhuanmars
  • linhuanmars
  • 2014年03月27日 01:15
  • 10070

Lintcode30 Insert Interval solution 题解

【题目描述】 Given a non-overlapping interval list which is sorted by start point.Insert a new interv...
  • xuxu_ban
  • xuxu_ban
  • 2017年04月23日 21:20
  • 163

[Java]LeetCode57 Insert Interval

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa...
  • fumier
  • fumier
  • 2015年08月18日 20:52
  • 850

leetCode 57.Insert Interval (插入区间) 解题思路和方法

Insert Interval  Given a set of non-overlapping intervals, insert a new interval into the interva...
  • xygy8860
  • xygy8860
  • 2015年07月15日 14:11
  • 729

【LeetCode】Insert Interval 解题报告

【题目】 Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if ...
  • ljiabin
  • ljiabin
  • 2015年04月07日 17:28
  • 1982

【leetcode】Array——Insert Interval(57)

题目:Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if nece...
  • u013127687
  • u013127687
  • 2016年03月13日 21:04
  • 194

LeetCode之Merge Interval

/*这个问题可以直接采用Insert Interval问题中采用的方法,创建一个Interval集合,不断的将旧集合中的 Interval合并进来,最终完成Merge Interval功能。 解决In...
  • shiyimin1
  • shiyimin1
  • 2015年03月04日 21:49
  • 280

57 Insert Interval

题目链接:https://leetcode.com/problems/insert-interval/题目:Given a set of non-overlapping intervals, inse...
  • ChilseaSai
  • ChilseaSai
  • 2015年10月11日 17:23
  • 444
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Insert Interval Array
举报原因:
原因补充:

(最多只允许输入30个字)