57插入区间(贪心法)
1、题目描述
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
2、示例
输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出: [[1,2],[3,10],[12,16]]
解释: 这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
3、题解
基本思想:贪心法,newInterval把intervals分成三部分,第一部分intervals[i][1]<newInterval[0],第二部分有重叠区间,第三部分newInterval[1]<intervals[i][0]。对于每一部分分别保存到res,复杂一点的就是重叠部分,newInterval[0]<=intervals[i][1]&&intervals[i][0]<=newInterval[1],求最大范围区间。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
//基本思想:贪心法,newInterval把intervals分成三部分,第一部分intervals[i][1]<newInterval[0],第二部分有重叠区间,第三部分newInterval[1]<intervals[i][0]
//对于每一部分分别保存到res,复杂一点的就是重叠部分,newInterval[0]<=intervals[i][1]&&intervals[i][0]<=newInterval[1],求最大范围区间
vector<vector<int>> res;
int i;
i = 0;
while (i < intervals.size() && intervals[i][1] < newInterval[0])
{
res.push_back(intervals[i]);
i++;
}
while (i < intervals.size() && intervals[i][0] <= newInterval[1])
{
newInterval[0] = min(newInterval[0], intervals[i][0]);
newInterval[1] = max(newInterval[1], intervals[i][1]);
i++;
}
res.push_back(newInterval);
while (i < intervals.size())
{
res.push_back(intervals[i]);
i++;
}
return res;
}
};
int main()
{
Solution solute;
vector<vector<int>> intervals = { {1, 3} ,{6, 9} };
vector<int> newInterval = { 10,11 };
vector<vector<int>> res = solute.insert(intervals, newInterval);
for (int i = 0; i < res.size(); i++)
{
for (int j = 0; j < res[i].size(); j++)
cout << res[i][j] << " ";
cout << endl;
}
return 0;
}