算法通关村第十七关:白银挑战-贪心高频问题
白银挑战-贪心高频问题
1. 区间问题
所有的区间问题,参考下面这张图
1.1 判断区间是否重叠
LeetCode252
https://leetcode.cn/problems/meeting-rooms/
思路分析
因为一个人在同一时刻只能参加一个会议,因此题目的本质是判断是否存在重叠区间
- 将区间按照会议开始时间进行排序
- 然后遍历一遍判断后面的会议开始的时候是否前面的还没有结束
- 如果出现重叠,返回false
代码实现
class Solution:def canAttendMeetings(self, intervals: List[List[int]]) -> bool:intervals.sort(key=lambda x: x[0])for i in range(1, len(intervals)):if intervals[i][0] < intervals[i - 1][1]:return Falsereturn True
class Solution:def canAttendMeetings(self, intervals: List[List[int]]) -> bool:intervals.sort(key=lambda x: x[0])return all(intervals[i][0] >= intervals[i - 1][1] for i in range(1, len(intervals)))
1.2 合并区间
LeetCode 56
https://leetcode.cn/problems/merge-intervals/
思路分析
- 首先对区间按照起始端点进行升序排序
- 然后逐个判断当前区间是否与前一个区间重叠
如果不重叠,直接加入结果集
如果重叠,将当前区间与前一个区间进行合并
区间合并
区间1,区间2 合并
[ 区间1起始时间,max(区间1结束时间,区间2结束时间) ]
代码实现
class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:intervals.sort(key=lambda x: x[0])merged = []for interval in intervals:# 合并列表为空if not merged:merged.append(interval)# 当前区间与上一区间不重叠elif interval[0] > merged[-1][1]:merged.append(interval)# 当前区间与上一区间重叠,需要合并else:# 区间合并操作merged[-1][1] = max(merged[-1][1], interval[1])return merged
1.3 插入区间
LeetCode57
https://leetcode.cn/problems/insert-interval/
思路分析
区间已经按照起始端点升序排序,我们直接遍历区间列表,寻找新区间的插入位置即可
- 将新区间左边且相离的区间加入结果集
- 接着判断当前区间是否与新区间重叠
重叠,进行合并,直到遍历到当前区间在新区间右边且相离,加入合并后区间
不重叠,直接加入新区间 - 将新区间右边且相离的区间加入结果集
代码实现
class Solution:def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:inserted = []index = 0n = len(intervals)# 将新区间左边且相离的区间加入结果集while index < n and intervals[index][1] < newInterval[0]:inserted.append(intervals[index])index += 1# 接着判断当前区间是否与新区间重叠# 重叠,进行合并,直到遍历到当前区间在新区间右边且相离,加入合并后区间# 不重叠,直接加入新区间while index < n and intervals[index][0] <= newInterval[1]:newInterval[0] = min(newInterval[0], intervals[index][0])newInterval[1] = max(newInterval[1], intervals[index][1])index += 1inserted.append(newInterval)# 将新区间右边且相离的区间加入结果集while index < n:inserted.append(intervals[index])index += 1return inserted
class Solution:def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:inserted = []index = 0n = len(intervals)while index < n:if intervals[index][1] < newInterval[0]:inserted.append(intervals[index])index += 1elif intervals[index][0] <= newInterval[1]:newInterval[0] = min(newInterval[0], intervals[index][0])newInterval[1] = max(newInterval[1], intervals[index][1])index += 1else:breakinserted.append(newInterval)inserted.extend(intervals[index:])return inserted
2. 字符串分割
LeetCode763
https://leetcode.cn/problems/partition-labels/
思路分析
需要把同一个字母圈在同一个区间里
该遍历过程相当于要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。
具体做法
- 统计每一个字符最后出现的位置
- 从头遍历字符,并更新字符最远出现下标,如果找到字符最远出现位置下标和当前下标相等,则找到了分割点
代码实现
class Solution:def partitionLabels(self, s: str) -> List[int]:ans = []# 第一轮遍历,统计每一个字符最后出现的位置char_dict = {}for i in range(len(s)):char_dict[s[i]] = i# 第二轮遍历begin_index = -1char_far_index = 0for i in range(len(s)):char_far_index = max(char_far_index, char_dict[s[i]])if char_far_index == i:ans.append(i - begin_index)begin_index = ireturn ans
class Solution:def partitionLabels(self, s: str) -> List[int]:last = [0] * 26for i, char in enumerate(s):last[ord(char) - ord('a')] = ipartition = list()start, end = 0, 0for i, char in enumerate(s):end = max(end, last[ord(char) - ord('a')])if i == end:partition.append(end - start + 1)start = end + 1return partition
3. 加油站问题
LeetCode134
https://leetcode.cn/problems/gas-station/
思路分析
很容易想到暴力解法,从第一站开始尝试。缺点就是需要大量的重复计算
优化:
总油量 - 总消耗 ≥ 0,可以跑完一圈,具体到每一段就是各个加油站的剩油量 rest[i] 相加一定是大于等于0的
- 每个加油站剩油量 rest[i] = gas[i] - cost[i]
- i从0开始累加 rest[i] ,得到当前油量 curSum
- 一旦curSum小于0,说明[0, i]区间都不能作为起始位置,起始位置必须从i+1开始重新算,只有这样才能保证有可能完成
复杂度降低:从O(n^2)降低到O(n)
代码实现
class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:total_sum = 0cur_sum = 0start = 0for i in range(len(gas)):cur_sum += gas[i] - cost[i]total_sum += gas[i] - cost[i]# 当前累加rest[i]和 cur_sum小于0if cur_sum < 0:# 更新起始位置为 i+1start = i+1# cur_sum从 0 开始cur_sum = 0return -1 if total_sum < 0 else start
相关文章:

算法通关村第十七关:白银挑战-贪心高频问题
白银挑战-贪心高频问题 1. 区间问题 所有的区间问题,参考下面这张图 1.1 判断区间是否重叠 LeetCode252 https://leetcode.cn/problems/meeting-rooms/ 思路分析 因为一个人在同一时刻只能参加一个会议,因此题目的本质是判断是否存在重叠区间 将区…...

目标检测评估指标mAP:从Precision,Recall,到AP50-95
1. TP, FP, FN, TN True Positive 满足以下三个条件被看做是TP 1. 置信度大于阈值(类别有阈值,IoU判断这个bouding box是否合适也有阈值) 2. 预测类型与标签类型相匹配(类别预测对了) 3. 预测的Bouding Box和Ground …...

七大排序算法
目录 直接插入排序 希尔排序 直接选择排序 堆排序 冒泡排序 快速排序 快速排序优化 非递归实现快速排序 归并排序 非递归的归并排序 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 常见的排序算法有插入排序(直接插入…...
GitHub two-factor authentication
1. 介绍 登录 GitHub 官网,会提示要开启双因子认证。 但推荐的 APP 都是国外了,国内用不了。 可以使用 “腾讯身份验证器” 微信小程序。 2. 操作 开启双因子认证: 打开 “腾讯身份验证器” 微信小程序,扫描 GitHub 那个二维…...

un-app-手机号授权登录-授权框弹不出情况
前言 手机号授权是获取用户信息api停用之后,经常使用的api。但是此api也是有很多坑 手机号授权会出现调用不起来的情况,这是因为小程序后台没有进行微信认证导致的 手机号授权调用不起来-没有微信认证 来到小程序后台-设置-基本设置-下拉找到微信认证…...

手写Spring:第14章-自动扫描Bean对象注册
文章目录 一、目标:自动扫描Bean对象注册二、设计:自动扫描Bean对象注册三、实现:自动扫描Bean对象注册3.0 引入依赖3.1 工程结构3.2 Bean生命周期中自动加载包扫描注册Bean对象和设置占位符属性类图3.3 主力占位符配置3.4 定义拦截注解3.4.1…...
redux中间件的简单讲解
redux中间件 中间件的作用: 就是在 源数据 到 目标数据 中间做各种处理,有利于程序的可拓展性,通常情况下,一个中间件就是一个函数,且一个中间件最好只做一件事情 数据源 --------> 中间件 --------> 中间件 -…...

嵌入式开发-绪论
目录 一.什么是嵌入式 1.1硬件系统 1.2软件系统 二.嵌入式应用场景 2.1消费电子 2.1.1智能家居 2.1.2影音 2.1.3家用电器 2.1.4玩具游戏机 2.2通信领域 2.2.1对讲机 2.2.2手机 2.2.3卫星 2.2.4雷达 2.3控制领域 2.3.1机器人 2.3.2采集器PLC 2.4金融 2.4.1POS…...
大数据知识合集之预处理方法
数据预处理方法主要有: 数据清洗、数据集成、数据规约和数据变换。 1、数据清洗 数据清洗(data cleaning) :是通过填补缺失值、光滑噪声数据,平滑或删除离群点,纠正数据的不一致来达到清洗的目的。 缺失值处理 实际开发获取信…...

mysql(九)mysql主从复制
目录 前言概述提出问题主从复制的用途工作流程 主从复制的配置创建复制账号配置主库和从库启动主从复制从另一个服务器开始主从复制主从复制时推荐的配置sync_binloginnodb_flush_logs_at_trx_commitinnodb_support_xa1innodb_safe_binlog 主从复制的原理基于语句复制优点&…...

nodejs采集淘宝、天猫网商品详情数据以及解决_m_h5_tk令牌及sign签名验证(2023-09-09)
一、淘宝、天猫sign加密算法 淘宝、天猫对于h5的访问采用了和APP客户端不同的方式,由于在h5的js代码中保存appsercret具有较高的风险,mtop采用了随机分配令牌的方式,为每个访问端分配一个token,保存在用户的cookie中,通…...

虚拟机上部署K8S集群
虚拟机上部署K8S集群 安装VM Ware安装Docker安装K8S集群安装kubeadm使用kubeadm引导集群 安装VM Ware 参考:http://www.taodudu.cc/news/show-2034573.html?actiononClick 安装Docker 参考:https://www.yuque.com/leifengyang/oncloud/mbvigg#2ASxH …...

设计模式 - 责任链
一、前言 相信大家平时或多或少都间接接触过责任链设计模式,只是可能有些同学自己不知道此处用的是该设计模式,比如说 Java Web 中的 Filter 过滤器,就是非常经典的责任链设计模式的例子。 那么什么是责任链设计模式呢? …...

【小沐学Unity3d】3ds Max 骨骼动画制作(CAT、Character Studio、Biped、骨骼对象)
文章目录 1、简介2、 CAT2.1 加载 CATRig 预设库2.2 从头开始创建 CATRig 3、character studio3.1 基本描述3.2 Biped3.3 Physique 4、骨骼系统4.1 创建方法4.2 简单示例 结语 1、简介 官网地址: https://help.autodesk.com/view/3DSMAX/2018/CHS https://help.aut…...

CUDA说明和安装[window]
文章目录 1、查看版本信息查看GPU查看cuda版本其他方法 2区分 了解cudaCUDA ToolkitNVCCcuDNN 3/ 安装过程4/版本的问题CUDA Toolkit和 显卡驱动 的版本对应CUDA / CUDA Toolkit和cuDNN的版本对应 5/关于CUDA和Cudnn**5.1 CUDA的命名规则****5.2 如何查看自己所安装的CUDA的版本…...

sqlserver2012性能优化配置:设置性能相关的服务器参数
前言 sqlserver2012 长时间运行的话会将服务器的内存占满 解决办法 通过界面设置 下图中设置最大服务器内存 通过执行脚本设置 需要先开发开启高级选项配置才能设置成功 设置完成之后将高级选择配置关闭,还原成跟之前一样 --可以配置高级选项 EXEC sp_conf…...

介绍 dubbo-go 并在Mac上安装,完成一次自己定义的接口RPC调用
目录 RPC 远程调用的说明作用:像调用本地方法一样调用远程方法和直接HTTP调用的区别:调用模型图示: Dubbo 框架说明Dubbo Go 介绍应用 Dubbo Go环境安装(Mac 系统)安装 Go语言环境安装 序列化工具protoc安装 dubbogo-c…...
目标检测数据集:摄像头成像吸烟检测数据集(自己标注)
1.专栏介绍 ✨✨✨✨✨✨目标检测数据集✨✨✨✨✨✨ 本专栏提供各种场景的数据集,主要聚焦:工业缺陷检测数据集、小目标数据集、遥感数据集、红外小目标数据集,该专栏的数据集会在多个专栏进行验证,在多个数据集进行验证mAP涨点明显,尤其是小目标、遮挡物精度提升明显的…...

Unity的UI管理器
1、代码 public class UIManager {private static UIManager instance new UIManager();public static UIManager Instance > instance;//存储显示着的面板脚本(不是面板Gameobject),每显示一个面板就存入字典//隐藏的时候获取字典中对…...
Mp4文件提取详细H.264和MP3文件
文章目录 Mp4文件提取为H.264和MP3文件**提取视频为H.264:****提取音频为MP3:** 点赞收藏加关注,追求技术不迷路!!!欢迎评论区互动。 Mp4文件提取为H.264和MP3文件 要将视频分开为H.264(视频编…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...