【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 };

 

posted @ 2023-09-05 10:40  Archigenius  阅读(38)  评论(0)    收藏  举报