首页 > 其他分享 >LeetCode题练习与总结:插入区间--57

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

时间:2024-04-07 19:04:59浏览次数:20  
标签:newInterval -- 57 interval int intervals 数组 区间 LeetCode

一、题目描述

示例 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返回一个二维数组,表示合并后的区间列表。

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

标签:newInterval,--,57,interval,int,intervals,数组,区间,LeetCode
From: https://blog.csdn.net/weixin_62860386/article/details/136997186

相关文章

  • 数据结构之顺序表
    目录一、顺序表源代码1.1SeqList.h1.2SeqList.c二、顺序表的应用2.1Contact.h2.2Contact.c2.3SeqList.h2.4SeqList.c2.5main.c一、顺序表源代码顺序表的底层实现为数组,源代码以整形数据为例,使用C语言编写1.1SeqList.htypedefintSLDataType;//动态顺......
  • opencv基础操作:读取图片时使用灰度方式、转换颜色空间、使用opencv展示图片、使用open
    包含的操作有:读取图片时使用灰度方式转换颜色空间使用opencv展示图片使用opencv对BGR通道进行划分并展示,需要注意的是直接使用cv2.split()得到的B,G,R分别是单通道的,因此最终展示出来为灰度图像。    如果想保留彩色图像,可以直接对img切片来实现。使用opencv在一个窗口......
  • Opencv实现边界填充、两个图片像素直接相加后超过255的处理方式(阈值处理方式),一个窗口
     opencv两个图片直接相加,会直接相加,如果超过255,会取模。 print((img_cat+img_cat2)[:5,:,0])#0-255若相加越界后294用294%256获得余数38可以使用这种方式查看。展示的是前5行,所有列的第一个通道的值。还有一种方法是cv2.add(),这个方法会直接将超过255的值设置为25......
  • 【沈阳航空航天大学】 <C++ 类与对象计分作业>
    C++类与对象1.设计用类完成计算两点距离2.设计向量类3.求n!4.出租车收费类的设计与实现5.定义并实现一个复数类6.线性表类的设计与实现7.数组求和8.数组求最大值1.设计用类完成计算两点距离【问题描述】设计二维点类Point,包括私有成员:横坐标x,纵坐标y。能够......
  • GO 语言编写的程序运行过程详解
    1.1go源代码packagemainfuncmain(){goadd(1,2)}funcadd(a,bint)(int,int,int){returna+b,a,b}1234567先来看看上面这段程序的反汇编代码:1.2add函数反汇编代码0x401050  48c744241800000000  MOVQ$0x0,0x18(SP)0x401059  48c744......
  • 南桥杯之穿越雷区
    #include<stdio.h>#include<stdlib.h>#include<stdbool.h>charmap[101][101];intdir[4][2]={-1,0,1,0,0,-1,0,1};//某个点的四个方向boolvist[101][101]={false};//标记是否已访问intXa,Ya,Xb,Yb,N,ans;//记录A,B坐标和步数structnode{ intx,y......
  • 移除元素 -- 力扣第27题 -- 暴力、双指针解法
    题目https://leetcode.cn/problems/remove-element/description/给你一个数组nums 和一个值val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需......
  • HTTP错误代码大全,http网站状态码各代表了什么?
    响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。响应码分五种类型,由它们的第一位数字表示:1、1xx:信息,请求收到,继续处理2、2xx:成功,行为被成功地接受、理解和采纳3、3xx:重定向,为了完成请求,必须进一步执行的动作4、4xx:客户端错误,请求包含语法错误或者......
  • 继续分享 Ti-FlowChart 可视化组件 0.2.1
    望向窗外月亮很亮,今晚继续分享组件开发状态。目前版本是0.2.1(npminstallti-flowchart)版本发布LOG:1.UI介入对局部的样式进行规范化。2.新增流转线动效,让用户能直观看出流向。3.新增操作界面的缩放能力,方便用户可以直观全景。组件的目标:组件UI色调大气,成品......
  • LeetCode题练习与总结:最后一个单词的长度--58
    一、题目描述给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词是指仅由字母组成、不包含任何空格字符的最大子字符串。示例1:输入:s="HelloWorld"输出:5解释:最后一个单词是“World”,长度为5。示例2:输入:s="......