LeetCode题练习与总结:插入区间--57

178 篇文章 0 订阅
113 篇文章 0 订阅

一、题目描述

示例 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] 重叠。

二、解题思路

  1. 初始化结果列表:创建一个列表来存储最终的区间结果。

  2. 遍历区间:遍历intervals数组和newInterval,对于每个区间,检查它与newInterval的关系。

  3. 处理区间:如果当前区间与newInterval不重叠,直接将其添加到结果列表中。如果重叠,需要将newInterval与当前区间合并,并将合并后的区间添加到结果列表中。

  4. 返回结果:将结果列表转换为二维数组并返回。

三、具体代码

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        List<int[]> result = new ArrayList<>();
        int start = newInterval[0];
        int end = newInterval[1];

        for (int[] interval : intervals) {
            if (interval[0] > end) {
                // 当前区间在newInterval的右侧,直接添加到结果中
                result.add(new int[]{start, end});
                start = interval[0];
                end = interval[1];
            } else if (interval[1] < start) {
                // 当前区间在newInterval的左侧,不需要合并,直接添加到结果中
                result.add(interval);
            } else {
                // 当前区间与newInterval有重叠,需要合并
                // 更新start和end为合并后的区间的起始和结束点
                start = Math.min(start, interval[0]);
                end = Math.max(end, interval[1]);
            }
        }
        // 添加最后一个区间
        result.add(new int[]{start, end});

        // 将列表转换为二维数组并返回
        return result.toArray(new int[0][0]);
    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        int[][] intervals = {{1,2},{3,5},{6,7},{8,10},{12,16}};
        int[] newInterval = {4,8};
        int[][] result = sol.insert(intervals, newInterval);
        for (int[] interval : result) {
            System.out.println("[" + interval[0] + ", " + interval[1] + "]");
        }
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 时间复杂度是O(n)。
  • 该算法的主要操作是遍历intervals数组中的每个区间,并与newInterval进行比较和合并。
  • 这个操作是线性的,因为它只涉及一次遍历,所以时间复杂度为O(n),其中n是intervals数组的长度。
2. 空间复杂度
  • 空间复杂度是O(n)。
  • 算法中使用了一个List<int[]>来存储结果,最坏情况下,这个列表将包含所有原始区间加上newInterval。因此,空间复杂度为O(n),其中n是intervals数组的长度。
  • 由于result.toArray(new int[0][0])这一行代码,算法还需要额外的空间来创建一个二维数组。这个数组的大小最多为intervals的长度加1,所以这部分的空间复杂度也是O(n)。

五、总结知识点

  1. 二维数组(int[][] intervals):用于存储区间列表,其中每个区间由一个包含两个整数的数组表示。

  2. 一维数组(int[] newInterval):表示要插入的单个区间。

  3. ArrayList 和 List 接口:用于动态存储和管理区间。ArrayList是一个可动态扩展和收缩的数组实现,提供了灵活的添加、删除和访问元素的方法。

  4. for-each 循环:用于遍历数组和列表中的元素。这是一种简洁的循环语法,允许我们直接访问集合中的每个元素,而不需要处理迭代器或索引。

  5. 条件语句(if-else):用于根据不同的条件执行不同的代码块。在这个例子中,我们根据区间的位置和关系来决定是否合并区间。

  6. 数组操作:包括创建数组、访问数组元素和修改数组元素的值。

  7. Math.min 和 Math.max 方法:用于计算两个数值中的最小值和最大值,这在合并区间时非常有用。

  8. toArray 方法List接口的toArray方法用于将列表转换为数组。在Java中,如果目标数组的类型与列表中元素的类型不匹配,需要指定目标数组的类型。

  9. 方法的返回值:方法insert返回一个二维数组,表示合并后的区间列表。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学习永不止步

谢谢您的鼓励,我会再接再厉的!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值