LeetCode 面试经典 150_区间_插入区间(50_57_C++_中等)(合并区间:划分处理)
LeetCode 面试经典 150_区间_插入区间(50_57_C++_中等)
- 题目描述:
- 输入输出样例:
- 题解:
- 解题思路:
- 思路一(合并区间:划分处理):
- 代码实现(思路一(合并区间:划分处理)):
- 以思路一为例进行调试
题目描述:
给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。
在 intervals 中插入区间 newInterval,使得 intervals 依然按照 starti 升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。
返回插入之后的 intervals。
注意 你不需要原地修改 intervals。你可以创建一个新数组然后返回它。
输入输出样例:
示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
示例 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] 重叠。
提示:
0 <= intervals.length <= 104
intervals[i].length== 2
0 <= starti <= endi <= 105
intervals 根据 starti 按 升序 排列
newInterval.length == 2
0 <= start <= end <= 105
题解:
解题思路:
思路一(合并区间:划分处理):
1、具体划分如下
- 将重叠之前的区间,加入到结果中 intervals[i][1] < newInterval[0]
- 将重叠区间进行合并,存入结果中 intervals[i][1] > newInterval[0] intervals[i][0] < newInterval[1]
- 将重叠区间之后的元素,存入结果中 else
2、复杂度分析:
① 时间复杂度:O(n),n 为数组中元素的个数,只遍历了一遍数组中的元素。
② 空间复杂度:O(1),除存储答案空间外使用常数个存储空间。
代码实现(思路一(合并区间:划分处理)):
class Solution {
public:vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {vector<vector<int>> ans;// 1. 先将所有在新区间之前的区间加入到结果中int i = 0;while (i < intervals.size() && intervals[i][1] < newInterval[0]) {ans.push_back(intervals[i]);i++;}// 2. 合并所有与新区间重叠的区间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++;}// 3. 将合并后的新区间加入结果ans.push_back(newInterval);// 4. 将所有在新区间之后的区间加入到结果中while (i < intervals.size()) {ans.push_back(intervals[i]);i++;}return ans;}
};
以思路一为例进行调试
#include<iostream>
#include<vector>
using namespace std;class Solution {
public:vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {vector<vector<int>> ans;// 1. 先将所有在新区间之前的区间加入到结果中int i = 0;while (i < intervals.size() && intervals[i][1] < newInterval[0]) {ans.push_back(intervals[i]);i++;}// 2. 合并所有与新区间重叠的区间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++;}// 3. 将合并后的新区间加入结果ans.push_back(newInterval);// 4. 将所有在新区间之后的区间加入到结果中while (i < intervals.size()) {ans.push_back(intervals[i]);i++;}return ans;}
};int main(int argc, char const *argv[])
{vector<vector<int>> intervals={{1,2},{3,5},{6,7},{8,10},{12,16}};vector<int> newInterval ={4,8};Solution s;vector<vector<int>> ans= s.insert(intervals,newInterval);for(auto &i:ans){cout<<" ["<<i[0]<<","<<i[1]<<"] ";}return 0;
}
LeetCode 面试经典 150_区间_插入区间(50_57)原题链接
欢迎大家和我沟通交流(✿◠‿◠)