力扣-56-合併區間
阿新 • • 發佈:2020-07-18
排序,我們會發現能合併區間的在排序後一定是連續的。如下圖:
排序後,前後兩個區間有以下三種情況:
那麼我們就判斷橙線的左端點和藍線的右端點之間的關係,來判斷是否合併。若能合併,合併區間的右端點是兩條線的最大右端點。
#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; } };