力扣区间题目:重叠、合并、插入、删除区间

一、汇总区间题目描述: 给定一个 无重复 元素的 有序 整数数组 nums 。返回恰好覆盖数组中所有数字的最小有序区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。列表中的每个区间范围 [ a , b ] 应该按如下格式输出:(1)、“a->b” ,如果 a != b  (2)、 “a” ,如果 a == b力扣:228. 汇总区间输入:nums = [ 0 , 1 , 2 , 4 , 5 , 7 ]输出:
摘要由CSDN通过智能技术生成

一、汇总区间


题目描述: 给定一个 无重复 元素的 有序 整数数组 nums 。
返回恰好覆盖数组中所有数字最小有序区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。
列表中的每个区间范围 [ a , b ] 应该按如下格式输出:(1)、“a->b” ,如果 a != b  (2)、 “a” ,如果 a == b
力扣:228. 汇总区间

输入:nums = [ 0 , 1 , 2 , 4 , 5 , 7 ]
输出:[“0->2”,“4->5”,“7”]
解释:区间范围是:
[0,2] --> “0->2”
[4,5] --> “4->5”
[7,7] --> “7”

题目分析: 通过示例,可以看出,区间是连续的,或者只有一个数两种情况,因为是有序的,在遍历的时候,如果 nums[i + 1] = nums[i] + 1 即可进行合并。

AC代码:

class Solution {
   
    public List<String> summaryRanges(int[] nums) {
   
        List<String> summary = new ArrayList<>();
        for (int i, j = 0; j < nums.length; ++j){
   
            i = j;
            while (j + 1 < nums.length && nums[j + 1] == nums[j] + 1)
                ++j;
            if (i == j) 
                summary.add(nums[i] + "");
            else
                summary.add(nums[i] + "->" + nums[j]);
        }
        return summary;
    }
}

二、合并区间


题目描述: 给出一个区间的集合,请合并所有重叠的区间。
力扣:56.合并区间

示例 1:
输入: intervals = [ [ 1 , 3 ] , [ 2 , 6 ] , [ 8 , 10] , [ 15 , 18] ]
输出: [ [ 1 , 6 ] , [ 8 , 10] , [ 15 , 18] ]
解释: 区间 [ 1 , 3 ] 和 [ 2 , 6 ] 重叠, 将它们合并为 [ 1 , 6 ] 。

题目分析: 首先对区间按照起始端点进行升序排序,然后逐个判断当前区间是否与前一个区间重叠,如果不重叠的话将区间直接加入结果集,反之如果重叠,就将当前区间与前一个区间进行合并。因为已经是按照起始点进行升序排序,合并时只需比较两个区间的尾端点,保留最大值,获得新区间。
排完序后主要分两种情况,相互分离,包含重叠部分。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值