力扣最热100题——56.合并区间

news2024/11/19 6:35:54

吾日三省吾身

还记得梦想吗

正在努力实现它吗

可以坚持下去吗

目录

吾日三省吾身

力扣题号:56. 合并区间 - 力扣(LeetCode)

题目描述

Java解法一:排序然后原地操作

具体代码如下

Java解法二:new一个list,然后两端操作

具体代码如下

解法一的C++版本

总结


 


力扣题号:56. 合并区间 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

        以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

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

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104


Java解法一:排序然后原地操作

  1. 特殊情况处理: 首先,检查输入的区间数组是否为空或只包含一个区间。如果是这种情况,直接返回原始的区间数组,因为不需要合并。

  2. 排序: 使用 Arrays.sort 方法对区间数组进行排序。排序的依据是区间的起始位置(o1[0] - o2[0]),这确保了数组按照起始位置升序排列。

  3. 合并重叠区间: 遍历排序后的区间数组。对于每一对相邻的区间,检查它们是否有重叠。如果存在重叠,将两个区间合并成一个,并用合并后的区间替代原来的两个区间。这一过程使用一个循环和条件语句来判断是否有重叠。

  4. 转换为数组: 使用 list.size() 创建一个相应长度的二维数组,并将 List 中的元素复制到该数组中。最后返回这个二维数组作为结果

具体代码如下
class Solution {
    public int[][] merge(int[][] intervals) {

        int length = intervals.length;
        // 0 个和一个都不用比了,直接返回
        if (length <= 1) {
            return intervals;
        }

        // 利用比较器来先排个序
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });
        // 定义一个list,这样长度才是动态的

        List<int[]> list = new ArrayList<>(Arrays.asList(intervals));
        
        
        for (int i = 0; i < list.size() - 1; i++) {
            // 获取第一个数组
            int[] arr1 = list.get(i);
            int start1 = arr1[0];
            int end1 = arr1[1];
            // 获取第二个数组
            int[] arr2 = list.get(i + 1);
            int start2 = arr2[0];
            int end2 = arr2[1];

            // 判断是否有重合
            if (end1 >= start2) {
                // 有重合,得到并集
                // [2,3],[4,5],[6,7],[8,9],[1,10]
                int[] bing = {Math.min(start1, start2), Math.max(end1, end2)};
                list.remove(i);
                list.set(i, bing);
                i--;
            }
        }

        int[][] res = new int[list.size()][];
        // 转化为int[][]
        int i = 0;
        for (int[] ints : list) {
            res[i++] = ints;
        }
        
        return res;
    }
}

虽然说不是很快,你就说好不好理解吧  (`へ´*)ノ


Java解法二:new一个list,然后两端操作

具体代码如下

作者:力扣官方题解
链接:https://leetcode.cn/problems/merge-intervals/solutions/203562/he-bing-qu-jian-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

下面是力扣的代码

  1. 特殊情况处理: 首先检查输入的区间数组是否为空。如果为空,直接返回一个空的二维数组 new int[0][2] 表示无合并区间。

  2. 排序: 使用 Arrays.sort 方法对区间数组进行排序,排序的依据是区间的起始位置,即 interval1[0] - interval2[0]

  3. 遍历合并: 遍历排序后的区间数组。对于每个区间,检查是否与之前的合并结果有重叠。如果没有重叠,直接将当前区间加入合并结果列表中。如果有重叠,更新合并结果列表的最后一个区间的结束位置,确保合并后的区间仍然是不重叠的。

  4. 转换为数组: 将最终的合并结果列表转换为二维数组,并返回作为结果。

class Solution {
    public int[][] merge(int[][] intervals) {
        if (intervals.length == 0) {
            return new int[0][2];
        }
        Arrays.sort(intervals, new Comparator<int[]>() {
            public int compare(int[] interval1, int[] interval2) {
                return interval1[0] - interval2[0];
            }
        });
        List<int[]> merged = new ArrayList<int[]>();
        for (int i = 0; i < intervals.length; ++i) {
            int L = intervals[i][0], R = intervals[i][1];
            if (merged.size() == 0 || merged.get(merged.size() - 1)[1] < L) {
                merged.add(new int[]{L, R});
            } else {
                merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1], R);
            }
        }
        return merged.toArray(new int[merged.size()][]);
    }
}

算你巧妙,但是我的还是更好理解一点(*^▽^*)

但是你小子也没快多少嘛  ╭(╯^╰)╮

解法一的C++版本

class Solution {
public:
    std::vector<std::vector<int>> merge(std::vector<std::vector<int>>& intervals) {
        int length = intervals.size();
        
        // 0 个和一个都不用比了,直接返回
        if (length <= 1) {
            return intervals;
        }

        // 利用比较器来先排个序
        std::sort(intervals.begin(), intervals.end(), [](const std::vector<int>& a, const std::vector<int>& b) {
            return a[0] < b[0];
        });

        // 定义一个vector,这样长度才是动态的
        std::vector<std::vector<int>> result(intervals);
        
        for (int i = 0; i < result.size() - 1; i++) {
            // 获取第一个数组
            std::vector<int>& arr1 = result[i];
            int start1 = arr1[0];
            int end1 = arr1[1];
            // 获取第二个数组
            std::vector<int>& arr2 = result[i + 1];
            int start2 = arr2[0];
            int end2 = arr2[1];

            // 判断是否有重合
            if (end1 >= start2) {
                // 有重合,得到并集
                // [2,3],[4,5],[6,7],[8,9],[1,10]
                std::vector<int> bing = {std::min(start1, start2), std::max(end1, end2)};
                result.erase(result.begin() + i);
                result[i] = bing;
                i--;
            }
        }

        return result;
    }
};

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

虽然慢的无语,但你就说过没过吧。。。。 ( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)

总结

挑战力扣失败,o(╥﹏╥)o

被制裁了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1505732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch学习 day04(Totensor、Normalize、Resize、Compose)

Totensor 把一个PIL格式的图片&#xff0c;或者ndarray格式的图片转换为tensor格式使用方法&#xff0c;如下&#xff1a; from PIL import Image from torchvision import transforms from torch.utils.tensorboard import SummaryWriterimg Image.open("images/00130…

算法——滑动窗口之找到字符串中所有的字母异位词,串联所有单词的子串

6.找到字符串中所有的字母异位词 题目:. - 力扣&#xff08;LeetCode&#xff09; 6.1如何快速判断两个字符串是否是异位词 假设现在有s1 aabca,s2 abaca,那么这两个就是异位词,容易想到的判断方法就是将两个字符串按照字典序排序,再依次比较,但是时间复杂度很高;我们看看…

python并发编程:IO模型比较分析

blocking和non-blocking的区别在哪&#xff0c;synchronous IO和asynchronous IO的区别在哪。 blocking vs non-blocking&#xff1a;调用blocking IO会一直block住对应的进程直到操作完成&#xff0c;而non-blocking IO在kernel还准备数据的情况下会立刻返回。 synchronous …

【R语言爬虫实战】抓取省市级城市常务会议内容

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

mysql如何开启手动提交事务

在mysql中&#xff0c;有一个变量autocommit&#xff0c;表示自动提交&#xff0c;默认为1&#xff0c;表示开启自动提交。通过以下命令查询 select autocommit;当autocommit为1时&#xff0c;任何一条sql语句都是一个事务&#xff0c;执行完由mysql自动提交。如果想自己决定什…

OS-Copilot:实现具有自我完善能力的通用计算机智能体

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ AI 缩小了人类间的知识和技术差距 论文标题&#xff1a;OS-Copilot: Towards Generalist Computer Agents with Self-Improvement 论文链接&#xff1a;https://arxiv.org/abs/2402.07456 项目主页&a…

32单片机基础:输入捕获测频率

接线图如下图所示&#xff1a; 我们复制之前写过的代码6-3 PWM驱动LED呼吸灯 在PWM模块中&#xff0c;执行的逻辑是&#xff0c;初始化TIM2的通道1&#xff0c;产生一个PWM波形&#xff0c;输出引脚是PA0&#xff0c;通过SetCompare1的函数&#xff0c;可以调节CCR1寄存器的值…

Memcached的重要性,如果防范Memcached DDOS攻击

一、Memcached简要 Memcached是一个开源的、高性能的、分布式内存对象缓存系统。它的主要目的是通过降低对数据库的访问来加速动态Web应用程序。 Memcached的用途非常广泛&#xff0c;它主要用于动态Web应用以减轻数据库负载。通过在内存中缓存数据和对象&#xff0c;Memcach…

pytorch_神经网络构建6

文章目录 强化学习概念实现qLearning基于这个思路,那么解决这个问题的代码如下 强化学习概念 强化学习有一个非常直观的表现&#xff0c;就是从出发点到目标之间存在着一个连续的状态转换&#xff0c;比如说从状态一到状态456&#xff0c;而每一个状态都有多种的行为&#xff…

2024/3/10 P1601高精加法

起因是本人在一个为数不多空闲的下午刷题ing&#xff0c;看到了AB problem。“就这&#xff1f;”从而忽略了高精这俩字&#xff0c;然后喜提40分。 于是开始研究何为高精。 #include<iostream> #include<string.h> #include<cstring>using namespace std; c…

数据结构与算法:链式二叉树

上一篇文章我们结束了二叉树的顺序存储&#xff0c;本届内容我们来到二叉树的链式存储&#xff01; 链式二叉树 1.链式二叉树的遍历1.1二叉树的前序&#xff0c;中序&#xff0c;后序遍历1.2 三种遍历方法代码实现 2. 获取相关个数2.1获取节点个数2.2获取叶节点个数2.3 获取树的…

代码随想录算法训练营第day14|二叉树理论基础、二叉树递归遍历、二叉树迭代遍历

目录 a.二叉树理论基础 b.二叉树递归遍历 c.二叉树迭代遍历 迭代法前序遍历 迭代法中序遍历 # 迭代法后序遍历 a.二叉树理论基础 在我们解题过程中二叉树有两种主要的形式&#xff1a;满二叉树和完全二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的…

Mysql 死锁案例1-记录锁读写冲突

死锁复现 CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB DEFAULT CHARSETutf8;/*Data for the table t */insert into t(id,c,d) values (0,0,0),(5,5,5),(10,10,10) 事务1事务2T1 START…

Java学习笔记------拼图游戏

图形化界面GUI GUI&#xff1a;Graphical User Interface&#xff08;图像用户接口&#xff09;&#xff0c;指采用图形化的方式显示操作界面 两套体系&#xff1a;AWT包中和Swing包中 组件 JFrame&#xff1a;最外层的窗体 JMenuBar&#xff1a;最上层菜单 JLaber&#…

【软考】图的遍历

目录 1. 概念2. 深度优先搜索2.1 说明2.2 步骤 3. 深度优先搜索例子3.1 无向图3.2 代码示例3.3 结果示例3.4 过程 4. 广度优先搜索4.1 说明4.2 步骤 5. 广度优先搜索例子5.1 无向图5.2 代码示例5.3 结果示例5.4 过程5.5 例题5.5.1 题目1 1. 概念 1.图的遍历是指从某个顶点出发…

递增三元组 刷题笔记

题意为 若存在 a中的数小于b中的数&#xff0c;b中的数小于c中的数 则该数算一种方案 思路 暴力模拟优化 两层循环遍历即可 从b到c的过程我们发现 第三层并不需要循环 直接加上 大于b的数量即可 那么第一层和第三层是对称的 我们有没有可能再去掉一层循环 只做一次遍历 …

Spring boot2.7整合jetcache 本地linkedhashmap缓存方案

好 上文 Spring boot2.7整合jetcache 远程redis缓存方案 我们讲完了 远程实现方案 本文 我们来说说 本地 jetcache解决方案 首先是 application.yml 在jetcache下加上 local:default:type: linkedhashmapkeyConvertor: fastjson我们技术用的 本地缓存 linkedhashmap 这里 我们…

netty草图笔记

学一遍根本记不住&#xff0c;那就再学一遍 public static void test_nettyFuture() {NioEventLoopGroup group new NioEventLoopGroup();log.info("开始提交任务");Future<String> future group.next().submit(() -> {log.info("执行异步任…

DualSPHysics使用FlowTool工具进行后处理,定义的粒子全在domains外,解决办法

可以知道DualSPHysics官方给了后处理工具使用的示例&#xff0c;如下就是官方给的案例&#xff0c;使用FlowTool工具可以计算出在两个实体domain内的粒子数。 然而我自己也定义了2个domains&#xff0c;但是计算出来Tank1和Tank2里边的粒子数一直是空的&#xff0c;粒子全部在…

微服务系列(一)springcloudAlibaba之Nacos注册和配置中心及openFeign远程调用

一&#xff0c;认识微服务 我们先看看开发大型项目采用单体架构存在哪些问题&#xff0c;而微服务架构又是如何解决这些问题的。 1.1 单体架构 单体架构&#xff08;monolithic structure&#xff09;&#xff1a;整个项目中所有功能模块都在一个工程中开发&#xff1b;项目部署…