返回介绍

lcof2 / 剑指 Offer II 074. 合并区间 / README

发布于 2024-06-17 01:04:41 字数 4299 浏览 0 评论 0 收藏 0

剑指 Offer II 074. 合并区间

题目描述

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

 

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

 

注意:本题与主站 56 题相同: https://leetcode.cn/problems/merge-intervals/

解法

方法一:区间合并

区间合并,将所有存在交集的区间进行合并。方法是:先对区间按照左端点升序排列,然后遍历区间进行合并。

模板:

def merge(intervals):
  ans = []
  intervals.sort()
  st, ed = intervals[0]
  for s, e in intervals[1:]:
    if ed < s:
      ans.append([st, ed])
      st, ed = s, e
    else:
      ed = max(ed, e)
  ans.append([st, ed])
  return ans
class Solution:
  def merge(self, intervals: List[List[int]]) -> List[List[int]]:
    intervals.sort()
    ans = []
    st, ed = intervals[0]
    for s, e in intervals[1:]:
      if ed < s:
        ans.append([st, ed])
        st, ed = s, e
      else:
        ed = max(ed, e)
    ans.append([st, ed])
    return ans
class Solution {
  public int[][] merge(int[][] intervals) {
    Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
    int st = intervals[0][0], ed = intervals[0][1];
    List<int[]> ans = new ArrayList<>();
    for (int i = 1; i < intervals.length; ++i) {
      int s = intervals[i][0], e = intervals[i][1];
      if (ed < s) {
        ans.add(new int[] {st, ed});
        st = s;
        ed = e;
      } else {
        ed = Math.max(ed, e);
      }
    }
    ans.add(new int[] {st, ed});
    return ans.toArray(new int[ans.size()][]);
  }
}
class Solution {
public:
  vector<vector<int>> merge(vector<vector<int>>& intervals) {
    sort(intervals.begin(), intervals.end());
    int st = intervals[0][0], ed = intervals[0][1];
    vector<vector<int>> ans;
    for (int i = 1; i < intervals.size(); ++i) {
      int s = intervals[i][0], e = intervals[i][1];
      if (ed < s) {
        ans.push_back({st, ed});
        st = s, ed = e;
      } else
        ed = max(ed, e);
    }
    ans.push_back({st, ed});
    return ans;
  }
};
func merge(intervals [][]int) [][]int {
  sort.Slice(intervals, func(i, j int) bool {
    return intervals[i][0] < intervals[j][0]
  })
  st, ed := intervals[0][0], intervals[0][1]
  var ans [][]int
  for _, e := range intervals[1:] {
    if ed < e[0] {
      ans = append(ans, []int{st, ed})
      st, ed = e[0], e[1]
    } else if ed < e[1] {
      ed = e[1]
    }
  }
  ans = append(ans, []int{st, ed})
  return ans
}
public class Solution {
  public int[][] Merge(int[][] intervals) {
    intervals = intervals.OrderBy(a => a[0]).ToArray();
    int st = intervals[0][0], ed = intervals[0][1];
    var ans = new List<int[]>();
    for (int i = 1; i < intervals.Length; ++i)
    {
      int s = intervals[i][0], e = intervals[i][1];
      if (ed < s)
      {
        ans.Add(new int[]{st, ed});
        st = s;
        ed = e;
      }
      else
      {
        ed = Math.Max(ed, e);
      }
    }
    ans.Add(new int[]{st, ed});
    return ans.ToArray();
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文