[leetcode]Insert Interval

今天遇到一个错误,叫Output Limit Exceeded。我还特地试了一下,当ArrayList里面添加超过9147个Interval后,就会有这个错误。所以这说明我的算法有误,没能merge对Interval,导致大数据测试时爆了。

---(--)--(-)--(------)--(--)-(---)---(----)---(--)---

                              {----------------------------} newInterval

错误原因是只merge了第一个,其实后面那些也要遍历判断,所以最差时间是O(n),基于此,前面部分我也直接遍历过来得了,代码简单。当然采用二分肯定是更优的解法。

public class Solution {
    public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {
        ArrayList<Interval> ans = new ArrayList<Interval>();
        int i = 0;
        int n = intervals.size();
        while (i < n && intervals.get(i).end < newInterval.start)
        {
            ans.add(intervals.get(i));
            i++;
        }
        // intervals[i].end >= newInterval.start
        while (i < n && intervals.get(i).start <= newInterval.end)
        {
            newInterval.start = Math.min(newInterval.start, intervals.get(i).start);
            newInterval.end = Math.max(newInterval.end, intervals.get(i).end);
            i++;
        }
        ans.add(newInterval);
        while (i < n)
        {
            ans.add(intervals.get(i));
            i++;
        }
        return ans;
    }
}

Python3,写的很烂。其实直接贪心添加就行。

class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        result = []
        start = newInterval[0]
        end = newInterval[1]
        
        overlapInterval = None
        
        for interval in intervals:
            # if no overlapping
            if interval[0] > end or interval[1] < start:
                pass
            else: # overlapping
                if overlapInterval is None:
                    overlapInterval = [min(start, interval[0]), max(end, interval[1])]
                else:
                    overlapInterval = [min(overlapInterval[0], interval[0]), max(overlapInterval[1], interval[1])]
                    
        if overlapInterval is not None:
            newInterval = overlapInterval
        
        inserted = False
        for interval in intervals:
            if not (interval[0] > newInterval[1] or interval[1] < newInterval[0]): # overlap
                continue
            elif (not inserted and interval[0] > newInterval[1]):
                result.append(newInterval)
                inserted = True
            result.append(interval)
                
        if not inserted:
            result.append(newInterval)
            
        return result

  

posted @ 2013-10-02 22:49  阿牧遥  阅读(838)  评论(0编辑  收藏  举报