首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode Insert Interval:區間插入與合併的優雅解法

     編輯:關於C++

題目描述

給定一組無重疊且按起始點升序排列的區間集合,插入一個新區間,必要時合併重疊區間,返回新的區間列表。

範例 1:intervals = [[1,3],[6,9]], newInterval = [2,5] → [[1,5],[6,9]]
範例 2:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,9] → [[1,2],[3,10],[12,16]]

算法思路

利用「合併區間」的經典邏輯:將新區間加入列表,重新排序,然後單次掃描合併。雖然排序帶來 O(n log n) 複雜度,但代碼極其簡潔,且對於 n ≤ 10^4 完全足夠。若要求 O(n),可利用原列表已有序特性,三段式處理(左不重疊、中間合併、右不重疊)。

Java 實現(排序法)

class Solution {
    public List insert(List intervals, Interval newInterval) {
        intervals.add(newInterval);
        return merge(intervals);
    }
    private List merge(List intervals) {
        if (intervals == null || intervals.size() <= 1) return intervals;
        intervals.sort(Comparator.comparingInt(i -> i.start));
        List res = new ArrayList<>();
        Interval prev = intervals.get(0);
        for (int i = 1; i < intervals.size(); ++i) {
            Interval cur = intervals.get(i);
            if (prev.end >= cur.start) { // 重疊
                prev = new Interval(prev.start, Math.max(prev.end, cur.end));
            } else {
                res.add(prev);
                prev = cur;
            }
        }
        res.add(prev);
        return res;
    }
}

O(n) 三段式優化(可選)

方法時間空間備註
排序法O(n log n)O(n)代碼簡短,通用性強
三段式O(n)O(n)利用有序特性,面試加分項

							
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved