当前位置: 首页 > news >正文

代码随想录算法训练营第二十六天|452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间

写代码的第二十六天
继续贪心贪心!!!

452. 用最少数量的箭引爆气球

思路

最少的弓箭引爆气球,那么就是要看有没有重复覆盖的区域,如果有的话,那么一个弓箭就能引爆重复区域的气球,所以本题就是要看有多少气球是重复的,如果重复就用一根弓箭,如果不重复就加一。
解决问题1:如何判断是否有重叠部分?将这个数组按照左端点位置排序,然后按照排序后的数组查看,第i位的数组的左端点的数值是否大于第i-1位数组的右端点的值,如果大于那么就证明不存在重叠的情况,弓箭数加一,否则就是重叠的。
解决问题2:题中没有说最多两个气球重叠,所以很有可能出现好几个气球是重叠的。就比如说i-1位和i位是重叠的,那i+1位是否和i-1和i的重叠部分也重叠的呢?我们思考一下i-1位和i位的重叠位置是i-1位的右下标到i位的左下标这个范围,那么就是说如果i+1位的左下标在上面的范围里面就证明他们仨重叠!所以i+1位的左下标只要小于等于i-1位的右下标即可。所以在这里我们要做的就是每次比较之后都更新右边界,也就是右下标,上面是举了个例子,但是代码要写普适性的代码,所以遍历的时候要保留每次的当前结点的右边界和上一位结点的右边界的最小值,这样在比较下一个结点的时候,直接和这个右边界进行比较,就可以走之前的if步骤的流程了,让当前结点的左边界和保留的最小右边界进行比较。
正确代码

class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:if len(points) == 0:return 0result = 1points = sorted(points,key=lambda x: (x[0], x[1]))for i in range(len(points)):if points[i][0] > points[i-1][1]:result += 1else:points[i][1] = min(points[i-1][1],points[i][1])return result

435. 无重叠区间

思路

本题和上面的题思路和注意点是一致的,只不过本题是要找到重叠区间,查看有几个重叠区间,所以初始化重叠区间为count=0,然后按照左下标进行从小到大的排序,排序后开始判断是否有重叠部分,按照上一道题的思路第i位的数组的左端点的数值是否大于第i-1位数组的右端点的值,如果大于那么就证明不存在重叠的情况,否则就存在重叠情况,count+=1;还有一个问题如果下面的数组的范围也在上面的重叠区间呢?和上一道题一样,我们记录每次重叠出现的最小右边界,这样如果接下来的数组左下标小于这个右下标就证明存在重叠,就回到了if的判断条件中了。
正确代码

class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:intervals = sorted(intervals,key=lambda x: (x[0], x[1]))count = 0for i in range(len(intervals)):if i > 0 and intervals[i][0] < intervals[i-1][1]:count += 1 intervals[i][1] = min(intervals[i][1],intervals[i-1][1])return count

763.划分字母区间

思路

本题要找的是字母的子区间并且顺序不能变,每个区间要包含这个字符串中出现字符的全部,比如说有a那就要包括这个s字符串中的所有a,一点思路也没有,直接看视频。。。
首先,建立哈希表,这个哈希表是用来存储s字符串中每个字符出现的最远的下标,这样就能在遍历s字符串的时候知道在s字符串中个子字符串的最远下标;其次我们要找的是每个子串的长度,所以需要知道每个子串的左端点left和右端点right,append进result的就是right-left+1,下一个left的位置就是之前子串的right+1;所以我们会发现需要判断的就是right的值,right值其实就是每遍历一个s中的字符都去看这个字符的最远位置在哪,如果该字符的最远位置和当前i的位置一致那么此时一个子串已经出来了;如果不一致那么就要每次的right值都更新为当前字符的最远距离和之前的right值最大的那个。
正确代码

class Solution:def partitionLabels(self, s: str) -> List[int]:hashtable = {}        for i in range(len(s)):hashtable[ord(s[i])-ord('a')] = iresult = []left = 0right = 0for i in range(len(s)):right = max(hashtable[ord(s[i])-ord('a')],right)if right == i:result.append(right-left+1)left = i + 1return result

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 11部门公布第二批国家数字乡村试点地区名单
  • uniapp微信小程序本地和真机调试文件图片上传成功但体验版不成功
  • K8S Service-NodePort:固定端口
  • 数据化项目中如何优化数据分析报表的响应速度
  • 宠物伴侣应用
  • Redisson中RSemaphore的使用场景及例子
  • 【微服务】微服务架构概念
  • 前端如何实现更换项目主题色的功能?
  • 全面整理人工智能(AI)学习路线图及资源推荐
  • 深度学习项目 -7-使用 Python 的手写数字识别
  • 多种方式防止表单重复提交
  • Docker容器资源限制
  • day2 PS教程——搞定图层的使用方法,效率大翻倍
  • 论文速递 | Operations Research 6月文章合集
  • 华为od机试真题:求字符串所有整数最小和(Python)
  • C++类中的特殊成员函数
  • canvas 绘制双线技巧
  • centos安装java运行环境jdk+tomcat
  • echarts花样作死的坑
  • Facebook AccountKit 接入的坑点
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript服务器推送技术之 WebSocket
  • Java到底能干嘛?
  • Linux快速复制或删除大量小文件
  • rabbitmq延迟消息示例
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • STAR法则
  • Webpack 4x 之路 ( 四 )
  • Zsh 开发指南(第十四篇 文件读写)
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 爱情 北京女病人
  • 关于extract.autodesk.io的一些说明
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 机器学习 vs. 深度学习
  • 近期前端发展计划
  • 马上搞懂 GeoJSON
  • 前端设计模式
  • 数据仓库的几种建模方法
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • ‌移动管家手机智能控制汽车系统
  • #ifdef 的技巧用法
  • #java学习笔记(面向对象)----(未完结)
  • #Z0458. 树的中心2
  • (0)Nginx 功能特性
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (论文阅读40-45)图像描述1
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (转)四层和七层负载均衡的区别
  • .bat批处理出现中文乱码的情况
  • .gitattributes 文件
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core 中插件式开发实现