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

JAVA代码编写

435. 无重叠区间

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠

示例 1:

输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

输入: intervals = [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

输入: intervals = [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

提示:

  • 1 <= intervals.length <= 105
  • intervals[i].length == 2
  • -5 * 104 <= starti < endi <= 5 * 104

教程:https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html

方法一:贪心

思路:和452. 用最少数量的箭引爆气球这一题很像,就是返回值不一样。

看看这个例子intervals = [[1,2],[2,3],[3,4],[1,3]]

步骤:

  1. 排序后是:intervals = [[1,2],[1,3],[2,3],[3,4]]
  2. 默认count是1(默认整个都是相交的),遍历intervals ,如果上一个区间的右边界 大于 下一个区间的左边界,也就是上一个区间和下一个区间有交集,那就将这个两个中较小的值赋给当前区间的右边界;否则count++。
  3. 最后返回intervals .length - count

在这里插入图片描述

复杂度分析

  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(n)
import java.util.Arrays;

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        // 排序方法1
        // Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
        // 排序方法2
        Arrays.sort(intervals,(a,b)->a[0]-b[0]); // (a, b) 是传递给比较函数的两个参数,即数组中的两个元素。a[0] - b[0] 实际上是计算两个数组元素第一列值的差,如果结果为负数,则 a 应该排在 b 的前面;如果结果为正数,则 a 应该排在 b 的后面。
        int count = 1;
        for(int i = 1;i < intervals.length;i++){
            if(intervals[i][0] < intervals[i-1][1]){
                intervals[i][1] = Math.min(intervals[i - 1][1], intervals[i][1]);
                continue;
            }else{
                count++;
            }
        }
        return intervals.length - count;
    }

    public static void main(String[] args) {
        int[][] intervals ={{1,2},{2,3},{3,4},{1,3}};
        Solution solution = new Solution();
        solution.eraseOverlapIntervals(intervals);
    }
}

763.划分字母区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s

返回一个表示每个字符串片段的长度的列表。

示例 1:

输入:s = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。 

示例 2:

输入:s = "eccbbbbdec"
输出:[10]

提示:

  • 1 <= s.length <= 500
  • s 仅由小写英文字母组成

教程:

https://programmercarl.com/0763.%E5%88%92%E5%88%86%E5%AD%97%E6%AF%8D%E5%8C%BA%E9%97%B4.html

方法一:贪心

思路:题目有点难懂,

  • 字符串划分为尽可能多的片段,也就是划分后的数组个数尽可能多。
  • 同一字母最多出现在一个片段中,也就是相同字母要放在一起。也可以理解为划分后的没有交集。

s = "ababcbacadefegdehijhklij"为例

步骤:

  1. 通过字母-‘a’获取索引,存入数组edge中。此时,edge = [8, 5, 7, 14, 15, 11, 13, 19, 22, 23, 20, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]。具体来说,edge[0]表示字母a最后一次出现的索引。0表示没有出现这个字母。
  2. 遍历chars数组,每次要划分的索引,是max(idx,edge[char[i]-‘a’]),知道索引==idx,就是找到了切割的点,这个条件还挺难找的。
  3. 通过当前的索引-last获取切分的长度
    在这里插入图片描述

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
import java.util.LinkedList;
import java.util.List;

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; // 存放字母a-z在数组chars中最后出现的位置,也就是最后出现的索引
        }
        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;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.partitionLabels("ababcbacadefegdehijhklij");
    }
}

56. 合并区间

以数组 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

教程:https://programmercarl.com/0056.%E5%90%88%E5%B9%B6%E5%8C%BA%E9%97%B4.html

方法一:贪心

思路

intervals = [[1,3],[2,6],[8,10],[15,18]]为例子

步骤

  1. 排序后:intervals = [[1,3],[2,6],[8,10],[15,18]]
  2. 遍历intervals ,如果左边界大于最大右边界,就添加到结果中,此时没有交集,直接加入结果,更新左边界和右边界;否则,合并和的区间就是[上一个区间的左边界,下一个区间的右边界],更新右边界
  3. 遍历完还要添加到结果

细节方面不是很懂,更新边界值那里。

复杂度分析

  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(logn)
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

class Solution {
    public int[][] merge(int[][] intervals) {
        List<int[]> res = new LinkedList<>();
        //按照左边界排序
        Arrays.sort(intervals, (x, y) -> Integer.compare(x[0], y[0]));
        //initial start 是最小左边界
        int start = intervals[0][0];
        int rightmostRightBound = intervals[0][1];
        for (int i = 1; i < intervals.length; i++) {
            //如果左边界大于最大右边界
            if (intervals[i][0] > rightmostRightBound) {
                //加入区间 并且更新start
                res.add(new int[]{start, rightmostRightBound});
                start = intervals[i][0];
                rightmostRightBound = intervals[i][1];
            } else {
                //更新最大右边界
                rightmostRightBound = Math.max(rightmostRightBound, intervals[i][1]);
            }
        }
        res.add(new int[]{start, rightmostRightBound});
        return res.toArray(new int[res.size()][]);
    }


    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.merge(new int[][] {{1,3},{2,6},{8,10},{15,18}});
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ASP.NET CORE】.NET 6.0 NET CORE MVC连接SQLSERVER数据库

项目装NuGet包&#xff0c;具体版本如下 在appsettings.json中&#xff0c;添加连接字符串 代码如下&#xff1a; "ConnectionStrings": {"MVCSqlContext": "Serverlocalhost;DatabaseAddress;User IDsa;Passwordsa;TrustServerCertificatetrue&q…

During handling of the above exception, another exception occurred解决方案

During handling of the above exception, another exception occurred解决方案 前言解决方案总结 前言 今天在写python读取图片中的内容的脚本的时候&#xff0c;常用的图像处理库包括Pillow和OpenCV。以下是使用Pillow库读取图片中的计算公式的示例代码&#xff1a; from P…

第五节HarmonyOS ArkTS声明式开发范式

ArkTS声明式开发范式&#xff1a; 规范中各个内容说明如下&#xff1a; 装饰器 1、基本UI装饰器Entry、Component Entry 装饰struct&#xff0c;页面的入口。 Component 装饰struct&#xff0c;表示该struct具有基于组件的能力。 2、数据装饰器State、Prop、Link State…

STM32CubeMX HAL F405 TIM1输出多路不同频率及占空比的方波(PWM)(输出比较模式)

TIM1_CH1 TIM1_CH1N TIM1_CH2 TIM1_CH2N TIM1_CH3 TIM1_CH3N TIM1_CH4 TIM1的通道1、2、3输出同频率&#xff08;20KHz&#xff09;的PWM波形(占空比50%) TIM1的通道1输出100Hz的PWM波形(占空比50%) #include "tim.h"/* USER CODE BEGIN 0 */ uint16_t f1 100;…

resty-http库爬虫程序代码示例

lua -- 导入需要的库 local http require "resty.http" local io require "io" -- 创建一个客户端 local client http.new() -- 设置HTTP客户端的 client:set_proxy(proxy_host, proxy_port) -- 执行HTTP GET请求&#xff0c;获取网页内容 local res…

低功耗蓝牙模块在农业技术中的创新应用

农业技术的不断演进对于提高农业生产效率和可持续性至关重要。本文将深入研究低功耗蓝牙模块在农业技术中的创新应用&#xff0c;探讨其在农业传感器网络、智能灌溉系统、畜牧追踪等方面的优势&#xff0c;以推动农业领域向数字化、智能化的方向发展。 随着全球人口的增长和气候…

51综合程序01-DAC转换输出波形

文章目录 DAC转换输出波形使用DA转换输出正弦波&#xff0c;三角波&#xff0c;锯齿波&#xff08;1&#xff09;仿真电路图&#xff08;2&#xff09;源代码&#xff08;3&#xff09;实验结果 DAC转换输出波形 使用DA转换输出正弦波&#xff0c;三角波&#xff0c;锯齿波 &…

如何判断哪种屋顶适合安装光伏板?

随着国家对可再生能源的推广和大力发展&#xff0c;光伏板开始被越来越多人所熟知。而将光伏板安装在家庭楼顶上&#xff0c;不仅可以有效节省土地和楼房面积&#xff0c;还能够为家庭提供更多的经济和环保效益&#xff0c;成为了越来越多人的选择。哪种屋顶适合安装光伏板呢&a…

ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO

ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 概述 前述博客讲解了 Web 编程的基本知识&#xff0c;包括 HTML、CSS、JavaScript 三个部分&#xff0c;从这节开始&#xff0c;我们进入实战部分&#xff0c;在实际项目中进一步学习 ESP32-Web 编程。 GPIO &#xff08…

leetCode 40.组合总和 II + 回溯算法 + 剪枝 + used数组 + 图解

给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 注意&#xff1a;解集不能包含重复的组合 示例 1: 输入: candidates [10,1,2,7,6,1,5], t…

linux安装minIo(亲测可用)

一、创建文件夹 进入opt文件夹 cd /opt/创建minio文件夹&#xff1b; mkdir minio赋予权限 chmod 777 minio/执行完后查看目录 进到minio文件夹 创建bin目录 mkdir bin创建data目录 mkdir data创建log touch minio.log创建start.sh文件&#xff0c;并写入数据(不会vi或…

搞定这三个问题 伦敦金止损就没问题

笔者多次强调&#xff0c;做伦敦金交易&#xff0c;重要的是风险控制。而止损是我们风险控制中一个很重要的概念。设定好止损&#xff0c;就是风险控制的好开始。下面我们通过三个问题&#xff0c;来解决止损的问题。 问题一&#xff0c;你的止损位在哪里&#xff1f;要做止损&…

多目标水母搜索算法(MOJS)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、多目标水母搜索算法MOJS 多目标水母搜索算法&#xff08;Multi-Objective Jellyfish Search algorithm&#xff0c;MOJS&#xff09;由Jui-Sheng Chou等…

软工2021上下午第六题(组合模式)

阅读下列说明和Java代码&#xff0c;将应填入&#xff08;n&#xff09;处的字句写在答题纸的对应栏内。 【说明】 层叠菜单是窗口风格的软件系统中经常采用的一种系统功能组织方式。层叠菜单中包含的可能是一个菜单项&#xff08;直接对应某个功能&#xff09;&#xff0c;也可…

three.js--立方体

使用three.js渲染出可以调节大小的立方体 1.搭建开发环境 1.首先新建文件夹用vsc打开项目终端 2.执行npm init -y 创建配置文件夹 3.执行npm i three0.152 安装three.js依赖 4.执行npm I vite -D 安装 Vite 作为开发依赖 5.根目录下新建index.html 作为页面入口文件 …

一文例说嵌入式 C 程序的内聚和耦合

1 - 原理篇 低耦合&#xff0c;是指模块之间尽可能的使其独立存在&#xff0c;模块之间不产生联系不可能&#xff0c;但模块与模块之间的接口应该尽量少而简单。这样&#xff0c;高内聚从整个程序中每一个模块的内部特征角度&#xff0c;低耦合从程序中各个模块之间的关联关系…

Java基于springboot开发的土特产网站商城多商家源码

主要功能&#xff1a;用户可以浏览特产&#xff0c;按分类和产地搜索&#xff0c;按分类查询特产&#xff0c;搜索店铺&#xff0c;查看评价&#xff0c;加入购物车&#xff0c;下单&#xff0c;查看店铺主页信息特产等店铺内搜索等&#xff1b;用户可申请开通店铺&#xff0c;…

AI伪原创软件-AI伪原创工具下载

在当今数字化时代&#xff0c;创作者们在追求独特创意的同时&#xff0c;也面临着时间和灵感的双重挑战。AI伪原创技术应运而生&#xff0c;为创作者提供了一种快捷而便利的解决方案。本文将专心分享两款备受瞩目的AI伪原创工具&#xff0c;147SEO伪原创、百度文心一言伪原创&a…

夸克大模型助力学术科研提效 四大优势提升知识正确性

当严谨的学术科研与创新的大模型技术结合在一起&#xff0c;会擦出什么样的火花&#xff1f;日前&#xff0c;夸克大模型甫一推出便以优秀的性能成为国产大模型中的“学霸”。在中国科学技术协会近期主办的“大模型应用场景研讨会”上&#xff0c;夸克大模型在快速阅读、创作润…

java开发之个微群聊管理

简要描述&#xff1a; 群管理操作 请求URL&#xff1a; http://域名/operateChatRoom 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明w…