【Leetcode刷题记录】1、汇总区间;2、合并区间;3、插入区间
1、汇总区间
题目:给定一个 无重复元素 的 有序 整数数组 nums 。
返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。
列表中的每个区间范围 [a,b] 应该按如下格式输出:
"a->b",如果a != b"a",如果a == b

思路:双指针,一次遍历!首先定义一个 left ,然后找到 right, 满足 [left,right) 区间内符合题目要求。然后另 left = right,继续更新 right。
代码:C++
1 class Solution { 2 public: 3 vector<string> summaryRanges(vector<int>& nums) { 4 vector<string> res; 5 int left = 0; 6 while(left < nums.size()){ 7 int right = left + 1; 8 while(right < nums.size() && nums[right] == nums[right-1] + 1){ 9 right++; 10 } 11 if(right - left == 1){ 12 res.push_back(to_string(nums[left])); 13 } else { 14 res.push_back(to_string(nums[left]) + "->" + to_string(nums[right-1])); 15 } 16 left = right; 17 } 18 return res; 19 } 20 };
2、合并区间
题目:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

思路:模拟!首先将数组 intervals 排序,同时新建一个数组 res,将 intervals 中的每个元素与 res 的尾元素比较,如果有交集,则合并;如果没有交集,则直接插入;注意当 res 为空时,直接插入即可!
代码:C++
1 class Solution { 2 public: 3 vector<vector<int>> merge(vector<vector<int>>& intervals) { 4 sort(intervals.begin(),intervals.end()); 5 vector<vector<int>> res; 6 for(auto const& inter : intervals){ 7 if(res.empty() || res.back()[1] < inter[0]){ 8 res.push_back(inter); 9 } else { 10 res.back()[1] = max(res.back()[1],inter[1]); 11 } 12 } 13 return res; 14 } 15 };
3、插入区间
题目:给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
思路:模拟!当数组内元素与插入区间没有交集时,直接插入到结果中;否则合并两个区间。
代码:C++
1 class Solution { 2 public: 3 vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) { 4 vector<vector<int>> res; 5 int left = newInterval[0]; 6 int right = newInterval[1]; 7 bool flag = true; 8 for(auto const& inter : intervals){ 9 if(inter[1] < left){ 10 res.push_back(inter); 11 } else if(inter[0] > right){ 12 if(flag){ 13 res.push_back({left,right}); 14 flag = false; 15 } 16 res.push_back(inter); 17 } else { 18 left = min(left,inter[0]); 19 right = max(right,inter[1]); 20 } 21 } 22 if(flag){ 23 res.push_back({left,right}); 24 } 25 return res; 26 } 27 };

浙公网安备 33010602011771号