题解 | #合并区间#
合并区间
https://www.nowcoder.com/practice/69f4e5b7ad284a478777cb2a17fb5e6a
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
// 排序
static bool comp(const Interval& a, const Interval& b) {
return a.start < b.start; // 增序排序
}
// 之前笔试时遇到过相似的题
// 先用 O(Nlogn) 时间来做下 空间O(N)
vector<Interval> merge(vector<Interval>& intervals) {
int n = intervals.size();
if (n < 2) {
return intervals;
}
// 排序
sort(intervals.begin(), intervals.end(), comp);
vector<Interval> ans;
stack<Interval> stk;
stk.push(intervals[0]);
int i = 1;
while(i<n)
{
Interval a = stk.top();
Interval b = intervals[i];
if(a.end >= b.start)
{
// 合并
stk.pop();
stk.push(Interval(a.start, max(a.end, b.end)));
}
else
{
stk.push(b);
}
i++;
}
// 从栈中取出
while(!stk.empty())
{
ans.push_back(stk.top());
stk.pop();
}
sort(ans.begin(), ans.end(), comp);
return ans;
}
};
自己扣的做法
用了栈 想到了 之前做过的括号消除 空间O(n)
时间 因为用了sort 平均是O(nlogn) 恩满足题目的要求了
