LeetCode—Merge Intervals,leetcodemerge
Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].
題目是很簡單的,就是比較兩個區間,又融合的就進行融合處理
第一反應就是先對資料進行一個簡單的sort排序,然後迴圈比較就可以了。在實際代碼中遇到一個問題就是在cmp函數中
如果將< 改為 <= 會出現逾時的情況
/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0) {} * Interval(int s, int e) : start(s), end(e) {} * }; */ bool cmp(const Interval &val1,const Interval &val2) { return (val1.start < val2.start); }class Solution {public: vector<Interval> merge(vector<Interval> &intervals) { vector<Interval> result; result.clear(); if(intervals.empty()) { return result; } sort(intervals.begin(),intervals.end(),cmp); int length = intervals.size(); result.push_back(intervals[0]); for(int i = 1; i < length; i++) { int n = result.size(); if((result[n-1].end >= intervals[i].start) && (result[n-1].start <= intervals[i].start)) { result[n-1].end = ((result[n-1].end > intervals[i].end)? result[n-1].end:intervals[i].end); } else { result.push_back(intervals[i]); } } return result; }};
上面這種解決方案還是比較直觀的,在這之前自己還寫了一個比較冗長的,沒有直接利用vector中的資料進行比較,而是單獨用的mergeVal,
這樣會導致一個問題就是在最後一個資料的時候需要自己再單獨放入到vector當中
/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0) {} * Interval(int s, int e) : start(s), end(e) {} * }; */ bool cmp(const Interval &val1,const Interval &val2) { return (val1.start < val2.start); }class Solution {public: vector<Interval> merge(vector<Interval> &intervals) { vector<Interval> result; result.clear(); if(intervals.empty()) { return result; } sort(intervals.begin(),intervals.end(),cmp); int length = intervals.size(); Interval mergeVal(0,0); mergeVal.start = intervals[0].start; mergeVal.end = intervals[0].end; if(length == 1) { result.push_back(mergeVal); return result; } for(int i = 1; i < length; i++) { if((mergeVal.end >= intervals[i].start) && (mergeVal.start <= intervals[i].start)) { mergeVal.end = ((mergeVal.end > intervals[i].end)? mergeVal.end:intervals[i].end); } else { result.push_back(mergeVal); mergeVal.start = intervals[i].start; mergeVal.end = intervals[i].end; } } result.push_back(mergeVal); //<將最後一個放入 return result; }};