[每天一道 Leetcode 求组队] 56. 合并区间

2018-08-29 20:12:39 +08:00
 Acceml

题目

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

题解

这个题的基本思路就是当两个区间有重合的时候,第一个区间的 end >= 第二个区间的 start。前提是我们都是从小到大排好序的。那么合并完的区间就是[第一个区间的 start, 第二个区间的 end]。遍历结束,即可得到最终的解。

/**
 * 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; }
 * }
 */
class Solution {
    public List<Interval> merge(List<Interval> intervals) {
        // sort start&end
        int n = intervals.size();
        int[] starts = new int[n];
        int[] ends = new int[n];
        for (int i = 0; i < n; i++) {
            starts[i] = intervals.get(i).start;
            ends[i] = intervals.get(i).end;
        }
        Arrays.sort(starts);
        Arrays.sort(ends);
        // loop through
        int i = 0;
        List<Interval> res = new ArrayList<>();
        while (i < n) {
            int st = starts[i];
            while (i < n - 1 && starts[i + 1] <= ends[i]) i++;
            int en = ends[i];
            res.add(new Interval(st, en));
            i++;
        }
        return res;
    }
}

热门阅读


最近在刷题,有一起的可以加手撕代码群:805423079

6882 次点击
所在节点    LeetCode
7 条回复
ihainan
2018-08-29 20:32:59 +08:00
[第一个区间的 start, 第二个区间的 end] 这是错的,应该是 [第一个区间的 start, 区间最大的 end],举例:[1, 4], [2, 3]。
Acceml
2018-08-30 09:14:14 +08:00
@ihainan 喔,是的~感谢指出。
wind3110991
2018-08-30 10:36:25 +08:00
def merge(region_list):

total_region = []

if not test_list:
return []

for region in region_list:
if not total_region:
total_region = region_list[0]
continue

# min
if total_region[0] > region[0]:
total_region[0] = region[0]

# max
if total_region[1] < region[1]:
total_region[1] = region[1]

return total_region

test_list = [[1,3],[2,6],[8,10],[15,18]]
test_list2 = [[1,4],[4,5]]
l1 = merge(test_list)
l2 = merge(test_list2)

print l1, l2
Raisu
2018-08-30 11:10:45 +08:00
一天一道太小了吧。。。
Acceml
2018-08-30 11:49:57 +08:00
@Raisu 刷题在精不在多。 前 200 道都理解了,去秒大型互联网公司的一面二面基本没问题
Raisu
2018-09-12 23:58:39 +08:00
我现在基本一天 3-5 道题,不过都是做的 easy,等做到 100 道以后就准备复习一下算法再做 medium 100 道。不知道到时候面试能过不
pg633
2018-12-10 10:07:45 +08:00
困难 随便切 ,中等 各种卡

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/484371

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX