【代码随想录算法训练营Day35】435.无重叠区间;763.划分字母区间;56.合并区间

news2024/11/24 3:20:07

文章目录

  • ❇️Day 36 第八章 贪心算法 part05
    • ✴️今日任务
    • ❇️435. 无重叠区间
      • 自己的思路
      • 自己的代码(✅通过81.59%)
      • 随想录思路
      • 随想录代码
    • ❇️763.划分字母区间
      • 自己的思路
      • 自己的代码(✅通过55.30%)
      • 随想录思路
      • 随想录代码
    • ❇️56. 合并区间
      • 自己的思路
      • 自己的代码(82.47%)
      • 随想录思路
      • 随想录代码

❇️Day 36 第八章 贪心算法 part05

✴️今日任务

今天的三道题目,都算是 重叠区间 问题,大家可以好好感受一下。 都属于那种看起来好复杂,但一看贪心解法,惊呼:这么巧妙!
还是属于那种,做过了也就会了,没做过就很难想出来。
不过大家把如下三题做了之后, 重叠区间 基本上差不多了

  • 435.无重叠区间
  • 763.划分字母区间
  • 56.合并区间

❇️435. 无重叠区间

  • 题目链接:https://leetcode.cn/problems/non-overlapping-intervals/
  • 视频讲解:https://www.bilibili.com/video/BV1A14y1c7E1
  • 文章链接:https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html

自己的思路

还和452一样,通过先确定右区间再判断左区间的方式
区别:当重叠时count++

自己的代码(✅通过81.59%)

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        int count = 0;
        Arrays.sort(intervals, new Comparator<int[]>() {
                @Override
                public int compare(int[] points1, int[] points2) {
                    if (points1[1] > points2[1]) {
                        return 1;
                    } else if (points1[1] < points2[1]) {
                        return -1;
                    }
                    return 0;
                }
            }
        );
        //for(int[] i :intervals) System.out.println(Arrays.toString(i));

        int end = 0; //被取右区间的范围下标
        int start = 1; //被取左区间的下标
        while(start < intervals.length){
            //System.out.println("次数:"+count);
            //重叠
            if(intervals[start][0] < intervals[end][1]){
                count ++;
                //System.out.println("气球{"+intervals[start][0]+", "+intervals[start][1]+"}可同时和气球{"+intervals[end][0]+", "+intervals[end][1]+"}一起被扎破");
            }else{
                end = start;
            }
            start ++;
        }

        return count;
    }
}

随想录思路

我来按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了。
此时问题就是要求非交叉区间的最大个数。
这里记录非交叉区间的个数还是有技巧的,如图:
在这里插入图片描述

随想录代码

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a,b)-> {
            return Integer.compare(a[0],b[0]);
        });
        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;
    }
}

❇️763.划分字母区间

  • 题目链接:https://leetcode.cn/problems/partition-labels/
  • 视频讲解:https://www.bilibili.com/video/BV18G4y1K7d5
  • 文章链接:https://programmercarl.com/0763.%E5%88%92%E5%88%86%E5%AD%97%E6%AF%8D%E5%8C%BA%E9%97%B4.html

自己的思路

  1. 定义一个二维数组的数组int count[26][]来存储字母最开始出现的下标和最后出现的下标
  2. 遍历字符串得到每个字母出现的区间
  3. 定义最小左区间和最大右区间

自己的代码(✅通过55.30%)

class Solution {
    public List<Integer> partitionLabels(String s) {
        int count[][] = new int[26][2];
        List<Integer> res = new ArrayList<>();
        for (int i = 1; i < s.length(); i++) {
            if(count[s.charAt(i)-'a'][1] == 0){
                if(s.charAt(i) != s.charAt(0)) {
                    count[s.charAt(i) - 'a'][0] = i;
                }
                count[s.charAt(i)-'a'][1] = i;
            }else{
                count[s.charAt(i)-'a'][1] = i;
            }
        }
        Arrays.sort(count, (a,b)-> {
            return Integer.compare(a[0],b[0]);
        });
        int left = 0;
        int right = count[0][1];
        for (int i = 0; i < 26; i++) {
            if(count[i][1] != 0) {
                if(count[i][0] <= right){
                    right = Math.max(right, count[i][1]);
                }else{
                    res.add(right - left + 1);
                    left = count[i][0];
                    right = count[i][1];
                }

            }
        }
        res.add(right - left + 1);
        return res;
    }
}

随想录思路

在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。
可以分为如下两步:

  • 统计每一个字符最后出现的位置
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

如图:
[图片]

随想录代码

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;
    }
}

❇️56. 合并区间

  • 本题相对来说就比较难了
  • 题目链接:https://leetcode.cn/problems/merge-intervals/
  • 视频讲解:https://www.bilibili.com/video/BV1wx4y157nD
  • 文章链接:https://programmercarl.com/0056.%E5%90%88%E5%B9%B6%E5%8C%BA%E9%97%B4.html

自己的思路

  1. 先对二维数组进行排序
  2. 判断后一个的左区间是否在前一个的右区间内
  3. 定义一个栈用来存放备选结果

自己的代码(82.47%)

public static int[][] merge(int[][] intervals) {
    //当二维数组只有一个一维数组时返回该一维数组
    if(intervals.length == 1) return intervals;
    //定义一个结果二维数组
    LinkedList<int[]> res = new LinkedList<>();
    //count是结果二维数组的长度,当有重叠长度-1
    int count = intervals.length;
    //排序二维数组
    Arrays.sort(intervals,(a,b) -> a[0] == b[0] ? a[1]-b[1] : a[0]-b[0]);
    //定义当前右区间
    int right = intervals[0][1];
    //将第一个数组加入备选区间
    res.push(intervals[0]);
    //从第二个区间开始遍历
    for (int i = 1; i < intervals.length; i++) {
        //如果这个和上一个区间有重叠
        if(intervals[i][0] <= right){
            //长度--
            count --;
            //更新右区间
            right = Math.max(intervals[i][1], right);
            //更新备选区间的右区间
            if(res.peek() != null && res.peek()[1] != right) {
                res.peek()[1] = right;
            }
        }else{
            //当没有重叠的时候直接加入备选区间
            res.push(intervals[i]);
            //更新用来对比的右区间
            right = intervals[i][1];
        }
    }
    return res.toArray(new int[count][]);
}

随想录思路

和我的基本一样

随想录代码

优化点:

  1. 栈的res.peek()可以换成res.removeLast();
  2. 可以去掉count,直接换成res.size()
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/1489290.html

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

相关文章

计算机网络-网络安全(二)

1.应用层安全协议&#xff1a; S-HTTP或SHTTP&#xff08;Sec HTTP&#xff09;&#xff0c;安全超文本传输协议&#xff0c;是HTTP扩展&#xff0c;使用TCP的80端口。HTTPS&#xff1a;HTTPSSL&#xff0c;使用TCP的443端口。和TLS&#xff08;传输层安全标准&#xff09;是双…

Linux 安装 Mysql 8.0

获取 Mysql 8.0 在 /usr/local下 创建mysql文件夹 mkdir mysql切换到mysql文件夹下 cd mysql下载mysql wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz解压mysql tar xvf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz重命名…

CSS技巧:实现两个div在同一行显示的方法

css如何让两个div在同一行显示 - web开发 - 亿速云 在Web开发中&#xff0c;经常遇到需要将多个元素水平排列在同一行的情况。其中一个常见的需求是将两个div元素放置在同一行上&#xff0c;使它们并排显示。在本文中&#xff0c;我们将介绍几种实现这一效果的CSS方法。 1. 使…

网络学习:SMart link技术与Monitor link技术

目录 一、SMart link技术 1.1、SMart link技术简介 1.2、SMart link技术原理及基础知识点 1、应用场景&#xff08;举例&#xff09;&#xff1a; 2、运行机制 3、保护vlan 4、控制VLAN 5、Flush报文 6、SMart link的负载分担机制 7、SMart link角色抢占模式 二、Mo…

MySQL的Redo Log、Undo Log、Binlog与Replay Log日志

前言 MySQL数据库作为业界最流行的开源关系型数据库之一&#xff0c;其底层实现涉及多种重要的日志机制&#xff0c;其中包括Redo Log、Undo Log、Binlog和Replay Log。这些日志组件共同确保MySQL数据库系统在面对事务处理、数据恢复和主从复制等方面表现出色。本文主要介绍一下…

08 OpenCV 腐蚀和膨胀

文章目录 作用算子代码 作用 膨胀与腐蚀是数学形态学在图像处理中最基础的操作。其卷积操作非常简单&#xff0c;对于图像的每个像素&#xff0c;取其一定的邻域&#xff0c;计算最大值/最小值作为新图像对应像素位置的像素值。其中,取最大值就是膨胀&#xff0c;取最小值就是腐…

就业班 2401--3.4 Linux Day10--软件管理

一、软件管理 导语&#xff1a; 安装软件 rpm yum 源码安装 ​ 卸载软件 rpm介绍 rpm软件包名称: 软件名称 版本号(主版本、次版本、修订号) 操作系统 -----90%的规律 #有依赖关系,不能自动解决依赖关系。 举例&#xff1a;openssh-6.6.1p1-31.el7.x86_64.rpm 数字前面的是名…

SpringBoot多数据源配置(MySql、Oracle)

一、依赖 <!-- dynamic-datasource 多数据源--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId></dependency><!--oracle驱动--><dependency><groupI…

机器视觉——硬件选型

1、相机选型 在选择机器视觉相机时&#xff0c;通常需要考虑以下几个方面&#xff1a; 1、分辨率&#xff1a;相机的分辨率决定了其拍摄图像的清晰度和细节程度。根据具体的应用需求&#xff0c;可以选择适当的分辨率范围。 2、帧率&#xff1a;帧率表示相机每秒钟能够拍摄的…

linux无法启动dhcp服务--Failed to start DHCPv4 Server Daemon.错误

linux dhcp服务搭建详细过程请看 linux系统dhcp服务部署 关于dhcp服务无法启动Failed to start DHCPv4 Server Daemon.错误 解决方法&#xff1a;虚拟网络编辑器中的也就是dhcp所要服务的子网ip地址要与dhcp.conf中的服务网段ip一致&#xff08;与上面subnet 192.168.1.0一致…

伊理威科技:抖音上开店铺需要什么条件

在数字浪潮的推动下&#xff0c;抖音已成为连接品牌与消费者的新桥梁。若想在此平台开设小店&#xff0c;需满足一系列条件&#xff0c;方可乘风破浪。首要条件是拥有一张有效的身份证明或企业营业执照&#xff0c;这是验证商家身份和合法经营的基础。接着&#xff0c;商品质量…

[C语言]——C语言常见概念(2)

目录 一.第⼀个C语言程序 二.main函数 三.print和库函数 1.print 2.库函数 四.关键字介绍 一.第⼀个C语言程序 #include <stdio.h> int main() {printf("hello C\n");return 0;//约定返回0&#xff0c;在c语言中&#xff0c;正常返回0&#xff0c;异常…

值得一看的博客

值得一看的blog GitHub - mqyqingfeng/Blog: 冴羽写博客的地方&#xff0c;预计写四个系列&#xff1a;JavaScript深入系列、JavaScript专题系列、ES6系列、React系列。 LogRocket Blog - Resources to Help Product Teams Ship Amazing Digital Experiences React Blog – Re…

【两万字面试系列】三年前的面试题。Service里面的线程安全问题

前言 三年前&#xff0c;大概是21年&#xff0c;那会刚学完java&#xff0c;然后去面试&#xff0c;被打的一塌糊涂&#xff0c;今天来盘一盘之前的面试&#xff0c;到底是怎样的问题整住了。然后发现了去年整的线程安全东西&#xff0c;也贴到文章后面了。那个贴的还不太准&a…

D-ID Studio:数字身份认证的新纪元

随着科技的飞速发展&#xff0c;数字身份认证已逐渐成为我们日常生活中不可或缺的一部分。在这个背景下&#xff0c;D-ID Studio以其前沿的技术和创新的解决方案&#xff0c;正引领着数字身份认证的新纪元。 D-ID Studio是一个功能强大的在线平台&#xff0c;专注于提供全面的…

字节如何用A/B测试,解决增长问题的?

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程&#xff0c;一周学完让你面试通过率提高90%&#xff01;&#xff08;自动化测试&#xff09; 摘要&#xff1a;上线六年&#xff0c;字节跳动的短视频产品——抖音已成为许多人记录美好生活的平台。除了抖音&…

ZABBIX修改web界面的 “支持“,“帮助”,“Integrations“。等菜单按钮,百试百灵,删除修改Help,Support菜单

♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ **ZABBIX修改web界面的 “支持”&#xff0c;“帮助”,“Integrations”。等菜单按钮&#xff0c…

SpringBoot3-Web开发

1. Web场景 1. 自动配置 1、整合web场景 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> 2、引入了 autoconfigure功能&#xff08;自动配置功能&#xff09…

数学建模【多元线性回归模型】

一、多元线性回归模型简介 回归分析是数据分析中最基础也是最重要的分析工具&#xff0c;绝大多数的数据分析问题&#xff0c;都可以使用回归的思想来解决。回归分析的任务就是&#xff0c;通过研究自变量X和因变量Y的相关关系&#xff0c;尝试去解释Y的形成机制&#xff0c;进…

OPC网关助力OPC UA/OPC DA协议数据采集

随着工业自动化程度的不断提高&#xff0c;OPC协议在数据采集、监控和控制系统中扮演着越来越重要的角色。其中&#xff0c;OPC UA和OPC DA是两种广泛应用的协议标准。而HiWoo Box作为一款功能强大的OPC网关解决方案&#xff0c;正是这些协议数据采集的得力助手。 一、OPC协议…