`

Leetcode - Insert Interval

 
阅读更多
[分析]
这道题思路直接,但bug free需要费些心力。第一版未优化的代码笔记长,未贴。
下面给出的两个实现,实现1是使用二分法找到新区间应插入的位置,然后检查是否需要和上一个区间合并(容易忽略),最后同后面的区间逐个检查是否需要合并。无需额外空间,Code Ganker 指出这种做法严格上非O(N),因为合并时有数组remove操作,最坏情况下是O(N^2),但跑leetcode测试用例这种实现比实现2效率高。
实现2:代码非常简洁,需要使用额外空间。先跳过新区间无交集且在新区间前面的,然后merge 和新区间有交集的,最后加上剩余的。


[ref]
http://blog.csdn.net/linhuanmars/article/details/22238433
http://blog.csdn.net/kenden23/article/details/17264441

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    // Method 2: 使用额外空间,Time:O(N)
    public List<Interval> insert2(List<Interval> intervals, Interval newInterval) {
        List<Interval> result = new ArrayList<Interval>();
        int i = 0;
        int N = intervals.size();
        while (i < N && newInterval.start > intervals.get(i).end) {
            result.add(intervals.get(i++));
        }
        if (i < N) {
            newInterval.start = Math.min(newInterval.start, intervals.get(i).start);
        }
        while (i < N && newInterval.end >= intervals.get(i).start) {
            newInterval.end = Math.max(newInterval.end, intervals.get(i++).end);
        }
        result.add(newInterval);
        while (i < N) {
            result.add(intervals.get(i++));
        }
        return result;
    }
    // Method 1: 二分法查找插入位置,无额外空间
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        if (intervals == null || intervals.size() == 0) {
            List<Interval> result = new ArrayList<Interval>();
            result.add(newInterval);
            return result;
        }
        int N = intervals.size();
        int i = findInsertPos(intervals, newInterval.start);
        // 判断是否需要和前一个区间merge
        if (i > 0 && intervals.get(i - 1).end >= newInterval.start) {
            newInterval.start = intervals.get(i - 1).start;
            newInterval.end = Math.max(newInterval.end, intervals.get(i - 1).end);
            intervals.remove(--i);
        }
        intervals.add(i, newInterval);
        i++;
        // 合并同newInterval有交集的区间
        while (i < intervals.size() && newInterval.end >= intervals.get(i).start) {
            newInterval.end = Math.max(newInterval.end, intervals.get(i).end);
            intervals.remove(i);
        }
        return intervals;
    }
    public int findInsertPos(List<Interval> intervals, int target) {
        int left = 0, right = intervals.size() - 1;
        int mid = 0;
        while (left <= right) {
            mid = left + ((right - left) >> 1);
            Interval curr = intervals.get(mid);
            if (curr.start == target)
                return mid;
            else if (curr.start > target)
                right = mid - 1;
            else
                left = mid + 1;
        }
        return left;
    }
}
分享到:
评论

相关推荐

    js-leetcode题解之57-insert-interval.js

    js js_leetcode题解之57-insert-interval.js

    java-leetcode题解之Insert Interval.java

    java java_leetcode题解之Insert Interval.java

    _leetcode-python.pdf

    - Insert Interval: 在一组已经排序的区间中,插入一个新的区间。 - Rotate List: 给定一个链表的头节点head,当旋转了k个位置后,返回链表的新头节点。 - Unique Paths / Unique Paths II: 前者计算从矩阵的左上角...

    颜色分类leetcode-leetcode.etc:OJ、leetcode等解决方案

    颜色分类leetcode leetcode.etc My solutions of the problems in Online judge website, leetcode, lintcode, etc. leetcode: 13 ...Insert Interval Easy Two Strings Are Anagrams(比较字符串) E

    LeetCode题解 - Java语言实现-181页.pdf

    10. Insert Interval 区间插入是一个数组问题,要求将一个区间插入到已经排序的区间数组中。可以使用二分搜索来解决该问题。 11. Two Sum 两数之和是一个经典的数组问题,要求找到数组中两个元素之和等于目标值的...

    leetcode答案-exercise-book:算法练习记录

    Interval 解决方法:遍历 LeetCode: 229. Majority Element II 解决方法:Majority Voting算法的变种。但是最终的算法实现形式,很难理解。 2018-08-19 19:16 LeetCode: 79. Word Search 解决方法:DFS LeetCode: 31...

    LeetCode最全代码

    # [LeetCode](https://leetcode.com/problemset/algorithms/) ![Language](https://img.shields.io/badge/language-Python%20%2F%20C++%2011-orange.svg) [![License]...

    LeetCode题解(java语言实现).pdf

    * Insert Interval:该题目要求将一个区间插入到另一个区间中,实现方法使用了排序和迭代算法。 三、字符串和动态规划 * String to Integer (atoi):该题目要求将字符串转换成整数,实现方法使用了状态机算法。 * ...

    C语言入门-leetcode练习之第57题插入区间.zip

    在本资源包中,我们关注的是C语言的学习以及如何通过LeetCode平台进行编程练习,特别是针对第57题“插入区间”(Insert Interval)的解题方法。LeetCode是一个在线平台,提供了各种算法题目,旨在帮助程序员提升技能...

    python-leetcode面试题解之第57题插入区间-题解.zip

    def insert(self, intervals, new_interval): intervals.append(new_interval) intervals.sort(key=lambda x: x.start) merged_intervals = [] for interval in intervals: if not merged_intervals or ...

    Leetcode部分解答(126题)

    5. **Merge Intervals(using (Insert Interval) ).cpp** - 这是第56题“合并区间”的解冑,涉及到区间操作,尤其是如何有效地插入新区间并合并重叠区间。 6. **Integer to Roman.cpp** - 第40题,与“Roman to ...

    c++-c++编程基础之leetcode题解第57题插入区间.zip

    第57题,"插入区间"(Insert Interval),是其中一道挑战性较高的问题,旨在检验开发者对区间操作、数据结构以及排序算法的理解。下面将详细探讨这个问题的背景、解题策略以及相关的C++编程知识点。 问题描述: ...

    gasstationleetcode-LeetCode:力码

    leetcode 力码 【吾生也有涯,而知也无涯。】 刷题解题记录: 大批: 220 包含重复 III 考 55 跳跃游戏45 跳跃游戏 II121 买卖股票的最佳时机 122 买卖股票的最佳时机 II123 买卖股票的最佳时机 III188 买卖股票的...

    Coding Interview In Java

    12 Insert Interval 45 13 Two Sum 47 14 Two Sum II Input array is sorted 49 15 Two Sum III Data structure design 51 16 3Sum 53 17 4Sum 55 18 3Sum Closest 57 19 String to Integer (atoi) 59 20 Merge ...

Global site tag (gtag.js) - Google Analytics