`

Leetcode - Merge Intervals

    博客分类:
  • Sort
 
阅读更多
Given a collection of intervals, merge all overlapping intervals.

[分析] 这题思路不难,将输入的区间数组按左边界排序然后合并。但是调试了很久,收获是熟悉了些Java语法。首先,忘记对ArrayList排序可以使用Collections.sort(),不厌其烦地在ArrayList和数组间转换为了能使用Arrays.sort进行排序;然后使用Iterator对Arrays.asList()转化得到的ArrayList进行删除操作时遭遇了java.lang.UnsupportedOperationException, Google上查了一番并查看相应实现知道通过Arrays.asList()获取到的List并不支持add和remove等修改操作,该List对象是在Arrays中实现的一个内部类ArrayList,继承AbstractList且没有重载AbstractList的add 和remove方法。一番修改后又撞上了java.lang.IllegalArgumentException: Comparison method violates its general contract!说我的Comparator实现得不对,不满足比较的基本性质,一查发现是有个手误。不断优化得到三个版本。

public class Solution {
    Comparator<Interval> comparator = new Comparator<Interval>() {
        public int compare(Interval a, Interval b) {
            return a.start - b.start;
        }
    };
    
    // Method 3: merge结果存储在额外List中, Method 2 的代码优化版
    public List<Interval> merge(List<Interval> intervals) {
        if (intervals == null || intervals.size() <= 1)
            return intervals;
        Collections.sort(intervals, comparator);
        List<Interval> result = new ArrayList<Interval>();
        int i = 0, N = intervals.size();
        while (i < N) {
            result.add(intervals.get(i++));
            Interval last = result.get(result.size() - 1);
            while (i < N && intervals.get(i).start <= last.end) {
                last.end = Math.max(last.end, intervals.get(i++).end);
            }
        }
        return result;
    }
    
    // Method 2: merge结果存储在额外List中
    public List<Interval> merge2(List<Interval> intervals) {
        if (intervals == null || intervals.size() <= 1)
            return intervals;
        Collections.sort(intervals, comparator);
        List<Interval> result = new ArrayList<Interval>();
        result.add(intervals.get(0));
        int i = 1;
        while (i < intervals.size()) {
            int currEnd = result.get(result.size() - 1).end;
            while (i < intervals.size() && currEnd >= intervals.get(i).end) {
                i++;
            }
            if (i == intervals.size()) break;
            if (intervals.get(i).start > currEnd)
                result.add(intervals.get(i));
            else
                result.get(result.size() - 1).end = intervals.get(i).end;
            i++;
        }
        return result;
    }
    
    // Method 1: 在原数组中merge
    public List<Interval> merge(List<Interval> intervals) {
        if (intervals == null || intervals.size() < 2)
            return intervals;
        Collections.sort(intervals, comparator);
        int i = 0;
        while (i < intervals.size() - 1) {
            Interval curr = intervals.get(i);
            Interval next = intervals.get(i + 1);
            if (curr.end >= next.start) {
                curr.end = Math.max(curr.end, next.end);
                intervals.remove(i + 1);
            } else {
                i++;
            }
        }
        return intervals;
    }
}
分享到:
评论

相关推荐

    js-leetcode题解之56-merge-intervals.js

    js js_leetcode题解之56-merge-intervals.js

    C语言-leetcode题解之56-merge-intervals.c

    c是最好的编程语言 C语言_leetcode题解之56-merge-intervals

    java-leetcode题解之Merge Intervals.java

    java java_leetcode题解之Merge Intervals.java

    _leetcode-python.pdf

    - Merge Intervals: 给定一组区间,请合并所有重叠的区间。 - Insert Interval: 在一组已经排序的区间中,插入一个新的区间。 - Rotate List: 给定一个链表的头节点head,当旋转了k个位置后,返回链表的新头节点。 -...

    LeetCode-Hot-100

    "Merge Intervals"则要求合并重叠的区间,考察了排序和区间操作技巧。 2. **算法**:题目涵盖排序算法(如快速排序、归并排序)、搜索算法(如二分查找)、动态规划(如斐波那契数列)、回溯法(如八皇后问题)等。...

    leetcode56-Leetcode56---Merge-Intervals:Leetcode56---合并间隔

    【标题】"LeetCode56 - 合并间隔"是一个编程挑战,主要涉及算法和数据结构的知识点。在这个问题中,任务是合并一系列非重叠的整数区间,以形成尽可能少的连续区间。 【描述】LeetCode是全球知名的在线编程训练平台...

    LeetCodeTrain:这是来自LeetCode的已解决任务的存储库

    这是来自LeetCode的已解决任务的存储库使用Java语言解决任务 ...repeating-character-replacement/ MergeIntervals.java - //leetcode.com/problems/merge-intervals/ ReverseLinkedList.java - //leetcode.com/problem

    java-leetcode-solutions:一些LeetCode问题的解决方案

    这些文件通常以问题的ID或标题命名,例如`TwoSum.java`, `MergeIntervals.java`等。通过阅读和分析这些代码,你可以了解如何运用不同的算法和数据结构来解决各种复杂的问题。 以下是一些可能涵盖的知识点: 1. **...

    leetcode-solution:leetcode的解决方法

    - "MergeIntervals.java":这道题目要求合并重叠的区间。Java实现中,先对区间按照起点排序,然后依次处理每个区间,通过比较当前区间的终点和已合并区间的终点,判断是否需要合并。 - "BinaryTree...

    猜单词leetcode-leetcodelearn:leetcodelearn

    猜单词leetcode leetcodelearn 2020-06-03 标题 2020-06-04 标题 2020-06-05 标题 2020-06-06 标题 2020-06-07 标题 标题 知识点 二分法 ...翻转单词顺序com/problems/merge-intervals/) 2020-06-20 标题

    LeetCode-Python

    2. "Merge Intervals"(合并区间):通过排序区间起始点,然后合并相邻的区间,Python的列表推导式能简化代码。 3. "Binary Tree Inorder Traversal"(二叉树中序遍历):Python的递归实现使得中序遍历变得简单。 ...

    Leetcode-Solutions:Leecode S30课程和盲目75个问题的解决方案

    通常,这些文件会按照题目的ID或者题目名称进行命名,例如"TwoSum"、"MergeIntervals"等,每个文件夹内部会有`.java`源代码文件,以及可能的测试文件。 在深入研究这个压缩包时,学习者可以期待获得以下方面的知识...

    leetcode中文版-LeetCode-OJ:我对leetcodeoj的回答

    leetcode中文版##LeetCode 在线裁判练习 更新频率:一天一题。 所有答案都是我自己完成的,换句话说,答案可能不是最好的,但可以接受。 从这些科目中,我发现动态规划非常重要。 ##难的 ###合并间隔 Given a ...

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

    9. Merge Intervals 区间合并是一个数组问题,要求合并重叠的区间。可以使用排序和迭代来解决该问题。 10. Insert Interval 区间插入是一个数组问题,要求将一个区间插入到已经排序的区间数组中。可以使用二分...

    Leetcode-OJ:Leetcode解决方案

    2. "Merge Intervals":通过排序和合并操作,将不重叠的时间区间合并成最少的区间。 3. "Longest Palindromic Substring":使用动态规划求解最长回文子串。 4. "Binary Tree Preorder Traversal":递归或迭代方式...

    javalruleetcode-LeetCode::lollipop:个人LeetCode习题解答仓库-多语言

    java lru leetcode :ice_cream: LeetCode Kindem 的个人 LeetCode 题解仓库,欢迎交流学习。 下面的目录中 $number 题号代表经典 LeetCode 题目,$number.$number ...LeetCode ...Merge Intervals 64 Minimum Path Sum 73

    leetcode答案-leetcode:leetcode的一些个人答案

    例如,"Merge Intervals"(合并区间)要求将一个区间列表合并成非重叠的区间,这需要对区间进行排序和合并的操作。 3. **设计模式**:LeetCode 中的部分题目涉及到设计特定的数据结构或算法实现,例如LRU缓存、Trie...

    leetcode答案-leetcode:leetcode问题的答案

    又如"Merge Intervals",需要合并重叠的时间区间,需要理解区间操作并合理排序。 LeetCode的答案通常有多种解法,包括但不限于暴力求解、递归、迭代、动态规划、贪心算法等。每种解法都有其适用场景和效率考虑,...

    leetcode答案-leetcode:leetcode习题答案

    而"Merge Intervals"(合并区间)则涉及到排序和区间处理,有助于理解如何高效地操作和合并数据结构。 其次,算法是LeetCode的核心部分。包括排序、搜索、图论、动态规划等。比如经典的"Longest Increasing ...

Global site tag (gtag.js) - Google Analytics