链接:57. 插入区间
题解:
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
// 1.区间无重合
vector<vector<int>> result;
if (intervals.size() == 0) {
result.push_back(newInterval);
return result;
}
int start = 0;
for (start = 0; start < intervals.size(); ++start) {
if (intervals[start][0] < newInterval[0]) {
result.push_back(intervals[start]);
} else {
break;
}
}
// 将newInterval插入
if (!result.empty() && result.back()[1] >= newInterval[0]) {
result.back()[1] = max(result.back()[1], newInterval[1]);
} else {
result.push_back(newInterval);
}
for (int i = start; i < intervals.size(); ++i) {
if (result.back()[1] >= intervals[i][0]) {
// 更新end末尾
result.back()[1] = max(result.back()[1], intervals[i][1]);
} else {
result.push_back(intervals[i]);
}
}
// RVO
return result;
}
};
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
int left = newInterval[0];
int right = newInterval[1];
bool placed = false;
vector<vector<int>> ans;
for (const auto& interval: intervals) {
if (interval[0] > right) {
// 在插入区间的右侧且无交集
if (!placed) {
ans.push_back({left, right});
placed = true;
}
ans.push_back(interval);
}
else if (interval[1] < left) {
// 在插入区间的左侧且无交集
ans.push_back(interval);
}
else {
// 与插入区间有交集,计算它们的并集
left = min(left, interval[0]);
right = max(right, interval[1]);
}
}
if (!placed) {
ans.push_back({left, right});
}
return ans;
}
};