LeetCode刷题之HOT100之合并区间

2024-06-05 20:04

本文主要是介绍LeetCode刷题之HOT100之合并区间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

雨下了一整天,中午早早就回去吃饭拿快递了,今天拿了很多快递。我的书回来啦哈哈,还有好多零食,爽歪歪啊,放在下面了,然后准备开始做题啦!
在这里插入图片描述
图一:左一是xh送我的,非常精彩(其他都是618购入)只买了陀爷和小波的,白夜行是朋友极力推荐购入
下次购书就不知道是啥时候了,毕竟现在任务落在我们身上,很难挤出时间来看看。Anyway,随性些,做题吧!

1、题目描述

在这里插入图片描述

2、逻辑分析

题目要求很清晰。我的大致思路是:遍历每个数组,将 i + 1个数组的第一个元素a与第 i 个数组的第二个元素b进行比较,如果a < b , 那么这两个数组满足要求,需要合并。如 [1,3] , [2,6]。2 < 3,亟需合并。是的,我写不出来。看了题解发现我想的太easy,很多情况未考虑。题解思路:

  1. 先排序,将整个数组以第一个元素进行排序。
  2. 遍历区间,如果结果数组是空的,或者当前区间的起始位置 >
    结果数组中最后区间的终止位置,则不合并,直接将当前区间加入结果数组。反之将当前区间合并至结果数组的最后区间。

3、代码演示

public int[][] merge(int[][] intervals) {// 第一步:根据区间的起始值对数组进行排序  // 使用lambda表达式定义排序规则,按照每个区间的第一个元素(即起始值)进行升序排序Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);// 第二步:初始化结果数组,大小与原始区间数组相同(但可能不完全使用)int [][] res = new int[intervals.length][2];// index用于跟踪结果数组中当前已使用的最后一个位置int index = -1;// 第三步:遍历排序后的区间数组for(int [] interval : intervals){// 如果结果数组为空,或者当前区间的起始值大于结果数组中最后一个区间的结束值  // 则说明当前区间与前一个区间没有重叠,可以直接添加到结果数组中if(index == -1 || interval[0] > res[index][1]){// 注意这里++index是先使用index的值,再自增res[++index] = interval;}else{// 如果当前区间与前一个区间有重叠  // 则更新结果数组中最后一个区间的结束值为当前区间和前一个区间的结束值中的较大者  // 这样可以确保合并后的区间包含所有重叠的部分  res[index][1] = Math.max(res[index][1], interval[1]);}}// 第四步:返回合并后的区间数组  // 因为结果数组可能并没有完全使用,所以需要复制一个只包含有效区间的新数组  // Arrays.copyOf方法用于创建一个新数组,并复制指定长度的元素到新数组中return Arrays.copyOf(res, index + 1);// index + 1表示有效区间的数量}

这注释解释的较明了,一看就会,一做就废,还在新手期,加油吧!hx。
在这里插入图片描述

4、复杂度分析

时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)。其中 n 为区间的数量。除去排序的开销,我们只需要一次线性扫描,所以主要的时间开销是排序的 O ( n log ⁡ n ) O(n\log n) O(nlogn)
空间复杂度: O ( log ⁡ n ) O(\log n) O(logn)。其中 n 为区间的数量。这里计算的是存储答案之外,使用的额外空间。 O ( log ⁡ n ) O(\log n) O(logn) 即为排序所需要的空间复杂度。

over,拜拜~

这篇关于LeetCode刷题之HOT100之合并区间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1034044

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &