LeetCodeブラッシングノート_56。マージ間隔

トピックはLeetCodeからです

56.統合間隔

他のソリューションまたはソースコードにアクセスできます:tongji4m3

解説

一連の間隔を指定して、重複するすべての間隔をマージしてください。

例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] 可被视为重叠区间。

促す:

intervals[i][0] <= intervals[i][1]

アイデア

按区间的第一个元素排序
for i in N:
    lo=intervals[i][0];
    hi=intervals[i][1];
    while(i+1<N && hi>=intervals[i+1][0]) hi=intervals[++i][1];//扩展该区间
    result.add((lo,hi));

細部

  1. 間隔の長さは、2つの結合された間隔の中で最大でなければなりません。
  2. コレクションと配列の変換操作に注意してください

コード

public int[][] merge(int[][] intervals)
{
    
    
    int N = intervals.length;
    List<int[]> result = new LinkedList<>();
    //按第一个元素排序
    Arrays.sort(intervals, (a,b) -> a[0]-b[0]);
    for (int i = 0; i < N; i++)
    {
    
    
        int lo=intervals[i][0];
        int hi=intervals[i][1];
        while(i+1<N && hi>=intervals[i+1][0])
        {
    
    
            ++i;//表明把下一个区间也纳入到了本区间里了
            hi=Math.max(hi,intervals[i][1]);//look 扩展该区间,选最大的一个
        }
        result.add(new int[]{
    
    lo, hi});
    }
    return (int[][]) result.toArray(new int [result.size()][2]);
}

複雑さの分析

時間の複雑さ

O(NログN)O(NログN) O N l o g N 、主にソートオーバーヘッド、もう1つはNオーバーヘッドのスキャン

スペースの複雑さ

O(ログN)O(ログN) O l o g N 、答えの外の余分なスペースのオーバーヘッドを計算します。これは、ソートに必要なスペースの複雑さです

おすすめ

転載: blog.csdn.net/weixin_42249196/article/details/108272283