代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间

news2024/12/16 1:45:47

代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间

文章链接:无重叠区间        划分字母区间        合并区间

视频链接:无重叠区间        划分字母区间        合并区间

1. LeetCode 435. 无重叠区间

1.1 思路

  1. 本题是通过删除最少个区间数使得这些区间没有重叠,注意 [1,2][2,3] 这种是不算重叠的。其实就是让我们求这些区间里有几个重叠区间,把个数统计出来然后输出即可
  2. 如何让这些区间尽可能重叠呢?通过排序。让相邻的区间挨在一起,挨个遍历时才能把重叠的区间给判断出来。那是按照左边界排序还是右边界排序呢?其实都可以,那接下来是按照左边界排序的
  3. 先判断数组长度是否为 0,为 0 直接 return 0。然后开始先对数组按照左边界排序,定义 count 计数
  4. for(int i=1;i<nums.length;i++),从 1 开始,因为要 i 和 i-1 比较。我们遍历到第 i 个区间,前一个区间是第 i-1 个,if(nums[i][0]>=nums[i-1][0])即 i 的左边界>= i-1 的右边界这种情况是不重叠的,由于挨着的不算重叠因此需要等于号,但我们要处理的是重叠区间,这里是不重叠的,因此这里不做处理
  5. else 即重叠,i 的左边界<i-1 的右边界,这里发现了重叠区间就 count++。我们这里知道了当前区间和上一个区间是重叠的了,那怎么知道下一个区间和这两个区间重不重叠呢?此时就要更新这两个区间的最小右边界,即 nums[i][1]=Math.min(nums[i][1],nums[i-1][1]),因为这个位置前面的位置一定是重叠的,而如果取了最大右边界,这两区间就不重叠了。
  6. 此时遍历到下一个区间了,这个区间为 i,拿 i 的左边界和上一个区间 i-1 更新后的右边界相比,如果 i 的左边界>=i-1 更新后的右边界,就没有重叠。如果<了就是重叠了

1.2 代码

//
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a,b)-> {
            return Integer.compare(a[0],b[0]);
        });
        int remove = 0;
        int pre = intervals[0][1];
        for(int i = 1; i < intervals.length; i++) {
            if(pre > intervals[i][0]) {
                remove++;
                pre = Math.min(pre, intervals[i][1]);
            }
            else pre = intervals[i][1];
        }
        return remove;
    }
}

2. LeetCode 763. 划分字母区间

2.1 思路

  1. 要让这个区间里的字符只出现在这个区间了,比如这个区间包含 a,其他 a 就不能出现在别的区间了
  2. 我们要统计每个字符出现过的最远位置,比如我们包含了 a,我们就要知道 a 最远出现在哪里,最远的位置之前就把当前字符出现的所有位置都包含了
  3. 整体是分为两步,一步需要记录每个元素出现的最远位置,接下来遍历的时候根据这个最远位置来决定这个区间的最远位置
  4. 首先定义个哈希数组,记录每个元素出现的最远位置,定义长度 27,因为 26 个字母,27 足够了
  5. for 循环第一次遍历数组获取哈希值,hash[s[i]-'a']=i;等于 i 是因为每次遍历更新的都是最新的下标位置。遍历结束后 hash 数组存的就是每个字符存的最远下标位置
  6. 定义个数组 result 存放结果,定义左区间和右区间的下标 left 和 right
  7. for 循环第二次遍历字符串数组,right=Math.max(right,hash[s[i]-'a']),因为我们要取的是每个字符出现的最远处,当 i 遍历到最远距离时即 i==right 就找到分割线了然后就 result 记录区间里的长度 right-left+1,更新 left=right+1。
  8. 最后 return result 即可

2.2 代码

//
class Solution {
    public List<Integer> partitionLabels(String S) {
        List<Integer> list = new LinkedList<>();
        int[] edge = new int[26];
        char[] chars = S.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            edge[chars[i] - 'a'] = i;
        }
        int idx = 0;
        int last = -1;
        for (int i = 0; i < chars.length; i++) {
            idx = Math.max(idx,edge[chars[i] - 'a']);
            if (i == idx) {
                list.add(i - last);
                last = i;
            }
        }
        return list;
    }
}

3. LeetCode 56. 合并区间

3.1 思路

  1. 本题和452. 用最少数量的箭引爆气球、435. 无重叠区间很相似。把本题的区间中有重叠的都合并,最终输出所有的区间。相邻挨在一起的也要合并。
  2. 首先我们要先给数组排序,按左边界或者右边界排序都是可以的。我们就按照左边界排序
  3. 如果第 i 个区间的左边界<=第 i-1 个区间的右边界,证明这两个区间重叠了,就要合并区间了。else 就是第 i 个区间的左边界>第 i-1 个区间的右边界,就可以把第 i-1 个区间放入我们的 result 中了
  4. 首先定义个二维数组 result,如果题目给的数组长度为 0 就直接 return null。然后我们就按照左边界排序数组
  5. 由于上面已经排除了数组为 0 的情况,因此数组里肯定有一个数组,就先放入 result 中,后续如果有数组和它重叠,就把它获取然后修改
  6. for(int i=1;i<intervals.length;i++)从 1 开始是因为第 i 个和第 i-1 个比较。if(intervals[i][0]<=intervals[i-1][1])这就是重叠了,然后我们就更新新数组的边界,由于左边界一定是最小的了,因此更新的是右边界,右边界由于可能出现 i-1 的右边界比 i 的右边界还大,取的是右边界的最大值,因此就是先获取 result 的最后一个数组result.getLast(),result.getLast()[1]=Math.max(result.getLast()[1],intervals[i][1])。以上就是合并的操作,并且不需要再放入 result 中。
  7. else 就是不重叠的情况,就直接把这区间放入 result,result.add(intervals[i])

3.2 代码

//
// 版本2
class Solution {
    public int[][] merge(int[][] intervals) {
        LinkedList<int[]> res = new LinkedList<>();
        Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
        res.add(intervals[0]);
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] <= res.getLast()[1]) {
                int start = res.getLast()[0];
                int end = Math.max(intervals[i][1], res.getLast()[1]);
                res.removeLast();
                res.add(new int[]{start, end});
            }
            else {
                res.add(intervals[i]);
            }         
        }
        return res.toArray(new int[res.size()][]);
    }
}

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

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

相关文章

matlab Spongent算法

1、内容简介 略 5-可以交流、咨询、答疑 2、内容说明 Spongent 是一种轻量级 Hash 算法&#xff0c;其原理与“海绵”类似&#xff0c;分为“吸收” 和“榨取”两个阶段&#xff0c;所以又可以称之为“海绵结构”算法。 Hash 函数之所以有广泛的应用&#xff0c;是因为它具…

图的应用4.0-----关键路径(AOE网)

目录 前言 AOE网 1.基本概念 2.应用 关键路径 1.算法理论 2.代码实现&#xff08;C/C&#xff09; 前言 前面学习了图AOV网的应用&#xff0c;即拓扑排序&#xff0c;那这一期我们学习AOE网的应用&#xff0c;这是一个图的一个很广泛问题&#xff0c;也就是关键路径。那…

红色荧光PLGA聚乙酸-羟基乙酸共聚物纤维膜 红色荧光PLGA静电纺丝纤维膜

一种含有荧光染料的硝酸纤维素微孔膜及其制备方法。将提供供体荧光分子的荧光染料直接加到铸膜液中&#xff0c;经相转换直接生产出一种带荧光的硝酸纤维素微孔膜&#xff0c;微孔膜中的荧光强度可以通过添加不同剂量的荧光素来控制调节&#xff0c;该微孔膜适用于生产荧光淬灭…

京东平台数据分析:2023年9月京东扫地机器人行业品牌销售排行榜

鲸参谋监测的京东平台9月份扫地机器人市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;9月份&#xff0c;京东平台扫地机器人的销量近14万&#xff0c;环比增长约2%&#xff0c;同比降低约4%&#xff1b;销售额为2.9亿&#xff0c;环比降低约4%&#xff0…

行情分析——加密货币市场大盘走势(10.27)

目前大饼开始了震荡盘整&#xff0c;目前远离EMA21均线&#xff0c;预计会有大的回调动作。而MACD日线来看&#xff0c;昨日和今日开始呈现绿色空心柱&#xff0c;也在说明大饼在做震荡盘整。不排除大跌的可能性&#xff0c;大饼可以开始布局中长线空单&#xff0c;可以再35000…

企业im即时通讯软件私有化部署,确保信息安全与高效办公

随着企业应用即时通讯&#xff08;IM&#xff09;的普及&#xff0c;信息安全问题成为了企业最为关心的话题。为了保障内部信息安全&#xff0c;让员工专心办公&#xff0c;企业可以选择将IM系统私有化部署在内网&#xff0c;与互联网隔离开来。 对于需要与外网通信的需求&…

Vue引入异步组件

defineAsyncComponent 函数&#xff1a;异步引入组件。 Suspense 标签&#xff1a;异步引入组件时&#xff0c;显示默认的内容。 异步引入组件的基本使用&#xff1a; 异步引入组件&#xff1a; import { defineAsyncComponent } from vue; const Child defineAsyncComponen…

基于安卓android微信小程序的投票系统

项目介绍 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;投票系统小程序被用户普遍使用&#xff0c;为方便用户…

关于JAVA中字节码文件版本号、产品版本号及开发版本号的关系

目录 关于字节码版本对应关系清单关于字节码格式说明的资料关于这些版本号 关于字节码版本 以二进制打开字节码文件&#xff1a; 如上图中第5-8标识&#xff08;圈起来的&#xff09;的即字节码版本号 十六进制&#xff1a; 34 十进制&#xff1a; 52 jdk 8 对应关系清单 …

网络策略实战

网络策略实战 网络策略 在命名空间 dev 中创建⽹络策略 dev-policy&#xff0c;只允许 命名空间 prod 中的 pod 连上 dev 中 pod 的 80 端⼝&#xff0c;注意:这⾥有 2 个 ns &#xff0c;⼀个为 dev(⽬标pod的ns)&#xff0c;另外⼀个为prod(访 问源pod的ns) &#x1f50b;创建…

熟悉项目过程中

刑天机器人本身 背景知识&#xff1a; 刑天与地平线的关系、旭日派的关系&#xff1f; 地平线是一家公司&#xff0c;刑天机器人是他们家的一款产品&#xff0c;是硬件&#xff0c;旭日派也是他们家的一款产品&#xff0c;用作刑天机器人的大脑。 刑天机器人的源代码能安装…

【网络安全无小事】汽车网络安全:只有开局,没有尽头,聚光向前,安全到达

“ 汽车网络安全: 只有开局&#xff0c;没有尽头&#xff0c;聚光向前&#xff0c;安全到达。” 01 — 引言 汽车一直以来都将速度、激情、男性荷尔蒙和阳刚气息联系在一起&#xff0c;这种联系似乎已经成为了文化符号。然而&#xff0c;作为一名安全从业者&#xff0c;我时常担…

汽车电子 -- Bin、Hex、Srec、s19、elf等文件的区别

一、烧写文件 烧写文件有很多种格式&#xff0c;比如bin、Hex、s19等。下面对这几种文件格式做一下介绍。 1、bin文件 参看&#xff1a;【嵌入式烧录/刷写文件】-3.1-详解二进制Bin格式文件 bin是binary的缩写&#xff0c;翻译为“二进制”。binary file 二进制文件是一个…

idea提交代码冲突后,代码意外消失解决办法

敲了大半天的代码&#xff0c;解决冲突后&#xff0c;直接消失了当时慌的一批CCCCC 右击项目Local History ----show History 找到最近提交的内容右击选择Revert,代码全回来了

python+request接口自动化框架

目前我们需要考虑的是如何实现关键字驱动实现接口自动化输出&#xff0c;通过关键字的封装实现一定意义上的脚本与用例的脱离&#xff01; robot framework 的安装不过多说明&#xff0c;网上资料比较太多~ 实例&#xff1a;&#xff01;&#xff01;&#xff01;&#xff01…

matlab simulink PMSM永磁电机DTC控制

1、内容简介 略 10-可以交流、咨询、答疑 2、内容说明 PMSM永磁电机DTC控制 PMSM、永磁电机、DTC控制 传 是 &#xff0c;它的工作原理是&#xff1a;首先设定好运行期望值和滞环的容差值&#xff0c;然后把电机 到的差值 号输出&#xff0c;可以 示需要减小 大输出…

​LeetCode解法汇总1465. 切割后面积最大的蛋糕

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 矩形蛋糕的…

ChatGLM系列七:LangChain+ChatGLM-6B

背景介绍 在开发过程中&#xff0c;我们经常会遇到需要构建基于本地知识库的问答系统的问题。这种系统需要能够根据用户提供的问题&#xff0c;在本地的知识库中查找并返回相关答案。然而&#xff0c;要实现这样的功能并不容易&#xff0c;涉及到语言模型的选择、知识库的管理…

OpenCV+OpenCvSharp实现图片特征向量提取与相似度计算

图片特征向量是一种用于描述图片内容的数学表示&#xff0c;它可以反映图片的颜色、纹理、形状等信息。图片特征向量可以用于做很多事情&#xff0c;比如图片检索、分类、识别等。 本文将介绍图片特征向量的提取以及相似度的计算&#xff0c;并使用C#来实现它们。 文章开始前&a…

论文阅读——BART

Arxiv: https://arxiv.org/abs/1910.13461 一个去噪自编码器的预训练序列到序列的模型。是一个结合了双向和自回归transformers的模型。 预训练分为两个阶段&#xff1a;任意噪声函数破坏文本和序列模型重建原始文本 一、模型 input&#xff1a;被破坏的文本-->bidirecti…