1. 程式人生 > 實用技巧 >力扣-56-合併區間

力扣-56-合併區間

題目

排序,我們會發現能合併區間的在排序後一定是連續的。如下圖:

排序後,前後兩個區間有以下三種情況:



那麼我們就判斷橙線的左端點和藍線的右端點之間的關係,來判斷是否合併。若能合併,合併區間的右端點是兩條線的最大右端點。

#include <algorithm>
#include <vector>

/*bool cmp(vector<int> x, vector<int> y){ //對vector按照左端點排序
    return x[0] < y[0];
}
*/

class Solution {
public:
    vector
<vector<int>> merge(vector<vector<int>>& intervals) { if (!intervals.size()) return {}; sort(intervals.begin(), intervals.end()); vector<vector<int>> result; for(const auto& array:intervals){ if (result.empty() || array.front() > result.back()[1
]) { result.push_back(array); } else{ result.back()[1] = max(result.back()[1], array.back()); } } return result; } };

當然也可以用雙指標對陣列區間進行操作,用end來儲存合併區間的最右端,更新即可。

#include <algorithm>
#include <vector>
/*
排序+雙指標*/ /*能進行合併的區間排序後一定是連續的*/ /*end維護合併區間的右端點*/ class Solution { public: vector<vector<int>> merge(vector<vector<int>>& intervals) { if (!intervals.size()) return {}; sort(intervals.begin(), intervals.end()); vector<vector<int>> result; for(int i = 0; i < intervals.size();){ int end = intervals[i][1]; int j = i + 1; while(j < intervals.size() && intervals[j][0] <= end){ //能進行合併 end = max(end, intervals[j][1]); j++; } result.push_back({intervals[i][0], end}); i = j; } return result; } };