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 js_leetcode题解之56-merge-intervals.js
c是最好的编程语言 C语言_leetcode题解之56-merge-intervals
java java_leetcode题解之Merge Intervals.java
- Merge Intervals: 给定一组区间,请合并所有重叠的区间。 - Insert Interval: 在一组已经排序的区间中,插入一个新的区间。 - Rotate List: 给定一个链表的头节点head,当旋转了k个位置后,返回链表的新头节点。 -...
"Merge Intervals"则要求合并重叠的区间,考察了排序和区间操作技巧。 2. **算法**:题目涵盖排序算法(如快速排序、归并排序)、搜索算法(如二分查找)、动态规划(如斐波那契数列)、回溯法(如八皇后问题)等。...
【标题】"LeetCode56 - 合并间隔"是一个编程挑战,主要涉及算法和数据结构的知识点。在这个问题中,任务是合并一系列非重叠的整数区间,以形成尽可能少的连续区间。 【描述】LeetCode是全球知名的在线编程训练平台...
这是来自LeetCode的已解决任务的存储库使用Java语言解决任务 ...repeating-character-replacement/ MergeIntervals.java - //leetcode.com/problems/merge-intervals/ ReverseLinkedList.java - //leetcode.com/problem
这些文件通常以问题的ID或标题命名,例如`TwoSum.java`, `MergeIntervals.java`等。通过阅读和分析这些代码,你可以了解如何运用不同的算法和数据结构来解决各种复杂的问题。 以下是一些可能涵盖的知识点: 1. **...
- "MergeIntervals.java":这道题目要求合并重叠的区间。Java实现中,先对区间按照起点排序,然后依次处理每个区间,通过比较当前区间的终点和已合并区间的终点,判断是否需要合并。 - "BinaryTree...
猜单词leetcode leetcodelearn 2020-06-03 标题 2020-06-04 标题 2020-06-05 标题 2020-06-06 标题 2020-06-07 标题 标题 知识点 二分法 ...翻转单词顺序com/problems/merge-intervals/) 2020-06-20 标题
2. "Merge Intervals"(合并区间):通过排序区间起始点,然后合并相邻的区间,Python的列表推导式能简化代码。 3. "Binary Tree Inorder Traversal"(二叉树中序遍历):Python的递归实现使得中序遍历变得简单。 ...
通常,这些文件会按照题目的ID或者题目名称进行命名,例如"TwoSum"、"MergeIntervals"等,每个文件夹内部会有`.java`源代码文件,以及可能的测试文件。 在深入研究这个压缩包时,学习者可以期待获得以下方面的知识...
leetcode中文版##LeetCode 在线裁判练习 更新频率:一天一题。 所有答案都是我自己完成的,换句话说,答案可能不是最好的,但可以接受。 从这些科目中,我发现动态规划非常重要。 ##难的 ###合并间隔 Given a ...
9. Merge Intervals 区间合并是一个数组问题,要求合并重叠的区间。可以使用排序和迭代来解决该问题。 10. Insert Interval 区间插入是一个数组问题,要求将一个区间插入到已经排序的区间数组中。可以使用二分...
2. "Merge Intervals":通过排序和合并操作,将不重叠的时间区间合并成最少的区间。 3. "Longest Palindromic Substring":使用动态规划求解最长回文子串。 4. "Binary Tree Preorder Traversal":递归或迭代方式...
java lru leetcode :ice_cream: LeetCode Kindem 的个人 LeetCode 题解仓库,欢迎交流学习。 下面的目录中 $number 题号代表经典 LeetCode 题目,$number.$number ...LeetCode ...Merge Intervals 64 Minimum Path Sum 73
例如,"Merge Intervals"(合并区间)要求将一个区间列表合并成非重叠的区间,这需要对区间进行排序和合并的操作。 3. **设计模式**:LeetCode 中的部分题目涉及到设计特定的数据结构或算法实现,例如LRU缓存、Trie...
又如"Merge Intervals",需要合并重叠的时间区间,需要理解区间操作并合理排序。 LeetCode的答案通常有多种解法,包括但不限于暴力求解、递归、迭代、动态规划、贪心算法等。每种解法都有其适用场景和效率考虑,...
而"Merge Intervals"(合并区间)则涉及到排序和区间处理,有助于理解如何高效地操作和合并数据结构。 其次,算法是LeetCode的核心部分。包括排序、搜索、图论、动态规划等。比如经典的"Longest Increasing ...