Skip to content

leetcode 56. Merge Intervals [Medium]

davidlei

題目敘述

題意很直觀:給定一組區間,把所有重疊的區間合併成一個。

思考

一開始沒想清楚就動手寫了,起初把情況分成三種 case,如下圖所示:

這樣的判斷方式很沒效率。後來想到可以先排序,讓 case B(後者起點小於前者起點)完全消失,大幅簡化主要邏輯。

這是個很值得記住的思路:當發現自己的解法需要同時處理「前後關係不確定」的情況時,先考慮排序能不能解決問題。這題只要按 start 排序,就不會再遇到 case B 的情況。

解題流程

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int length = intervals.size();
        vector<vector<int>> solution;
        sort(intervals.begin(), intervals.end());
        
        int cur = 0;
        while (cur < length) {
            int start = intervals[cur][0];
            int end = intervals[cur][1];
            
            int walker = cur + 1;
            while (walker < length) {
                if (intervals[walker][0] > end) {
                    break;
                }
                
                end = max(end, intervals[walker][1]);
                walker++;
            }
            solution.push_back({start, end});
            cur = walker;
        }
        return solution;
    }
};

這個版本還有改進空間,其實主要邏輯只需要一個 for 迴圈就能完成,速度也更快。不過這裡保留雙層迴圈的寫法,因為比較能直觀地對應到上面的示意圖。

Edit this post
Previous
leetcode 227. Basic Calculator II [Medium]
Next
golang 定時器(一) Time, Ticker 基本用法整理