算法通关村第十七关:白银挑战-贪心高频问题

news2024/9/22 11:39:49

白银挑战-贪心高频问题

1. 区间问题

所有的区间问题,参考下面这张图

在这里插入图片描述

1.1 判断区间是否重叠

LeetCode252
https://leetcode.cn/problems/meeting-rooms/

思路分析

因为一个人在同一时刻只能参加一个会议,因此题目的本质是判断是否存在重叠区间

  1. 将区间按照会议开始时间进行排序
  2. 然后遍历一遍判断后面的会议开始的时候是否前面的还没有结束
  3. 如果出现重叠,返回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 False

        return 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,区间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/

思路分析

区间已经按照起始端点升序排序,我们直接遍历区间列表,寻找新区间的插入位置即可

  1. 将新区间左边且相离的区间加入结果集
  2. 接着判断当前区间是否与新区间重叠
    重叠,进行合并,直到遍历到当前区间在新区间右边且相离,加入合并后区间
    不重叠,直接加入新区间
  3. 将新区间右边且相离的区间加入结果集

代码实现

class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        inserted = []
        index = 0
        n = 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 += 1
        inserted.append(newInterval)

        # 将新区间右边且相离的区间加入结果集
        while index < n:
            inserted.append(intervals[index])
            index += 1

        return inserted
class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        inserted = []
        index = 0
        n = len(intervals)

        while index < n:
            if intervals[index][1] < newInterval[0]:
                inserted.append(intervals[index])
                index += 1
            elif intervals[index][0] <= newInterval[1]:
                newInterval[0] = min(newInterval[0], intervals[index][0])
                newInterval[1] = max(newInterval[1], intervals[index][1])
                index += 1
            else:
                break
        inserted.append(newInterval)
        inserted.extend(intervals[index:])
        return inserted

2. 字符串分割

LeetCode763
https://leetcode.cn/problems/partition-labels/

思路分析

需要把同一个字母圈在同一个区间里

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

具体做法

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

在这里插入图片描述

代码实现

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 = -1
        char_far_index = 0
        for 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 = i

        return ans
class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        last = [0] * 26
        for i, char in enumerate(s):
            last[ord(char) - ord('a')] = i
        
        partition = list()
        start, end = 0, 0
        for i, char in enumerate(s):
            end = max(end, last[ord(char) - ord('a')])
            if i == end:
                partition.append(end - start + 1)
                start = end + 1
        
        return 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 = 0
        cur_sum = 0
        start = 0
        for i in range(len(gas)):
            cur_sum += gas[i] - cost[i]
            total_sum += gas[i] - cost[i]
            
            # 当前累加rest[i]和 cur_sum小于0
            if cur_sum < 0:
                # 更新起始位置为 i+1
                start = i+1
                # cur_sum从 0 开始
                cur_sum = 0
                
        return -1 if total_sum < 0 else start
        

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

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

相关文章

报错解决:RuntimeError: expected scalar type Long but found Float

文章目录 报错信息原因代码示例错误版改正 报错信息 RuntimeError: expected scalar type Long but found Float原因 nn.Linear需要作用于浮点数&#xff0c;这里可能输入了整数类型的张量作为参数。 代码示例 错误版 import torch import torch.nn as nn a torch.tensor…

53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面

基于注解开发 WebSocket –注解就是&#xff1a; OnOpen、 OnClose 、 OnMessage 、OnError这些 ★ WebSocket的两种开发方式 ▲ Spring Boot为WebSocket提供了两种开发方式&#xff1a; 基于spring-boot-starter-websocket.jar开发WebSocket 基于Spring WebFlux开发WebSoc…

常用消息中间件有哪些

RocketMQ 阿里开源&#xff0c;阿里参照kafka设计的&#xff0c;Java实现 能够保证严格的消息顺序 提供针对消息的过滤功能 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力 RabbitMQ Erlang实现&#xff0c;非常重量级&#xff0c;更适…

只依赖OPENCV的工作服安全帽检测YOLOV8S

工地安全帽工作服检测Y8S&#xff0c;采用YOLOV8S训练模型&#xff0c;然后使用OPENCV的DNN调用&#xff0c;彻底拜托PYTORCH依赖&#xff0c;可以在C,PYTHON,ANDROID上跑。附件是C生成的效果测试&#xff08;只需解压将图片或者视频放入VIDEOS文件夹&#xff0c;文件夹没图片或…

宝宝餐椅儿童商品认证和ASTM F404检测标准的重要性

大家都知道儿童餐椅是宝宝饮食的重要伙伴。它们为宝宝提供了一个舒适的环境&#xff0c;让宝宝在吃饭的时候更愉快&#xff0c;更健康。然而&#xff0c;许多家长可能不知道&#xff0c;亚马逊美国站售卖的儿童餐椅需要进行一系列严格的认证&#xff0c;以保护我们宝贝们的安全…

平板触控笔哪款好用?好用的第三方apple pencil

而对于那些把ipad当做学习工具的人而言&#xff0c;苹果Pencil就成了必备品。但因为苹果Pencil太贵了&#xff0c;不少的学生们买不起。因此&#xff0c;最佳的选择还是平替电容笔&#xff0c;今天在这里整理了一些高性价比的电容笔&#xff01; 一、挑选电容笔的要点&#xf…

视频云存储/安防监控/AI分析/视频AI智能分析网关:占道经营算法

在国家倡导“地摊经济”的发展下&#xff0c;越来越多的人们投身于摆摊大潮&#xff0c;街道上都是随处可见的流动摊贩。虽然“地摊经济”有利于个人的经济增长&#xff0c;但有很多流动摊贩无视法规&#xff0c;随意摆摊或占道经营&#xff0c;这种行为不仅影响城市容貌&#…

Excel怎么批量生成文件夹

Excel怎么批量生成文件夹的链接: https://jingyan.baidu.com/article/ea24bc398d9dcb9b63b3312f.html

提升网络安全防御能力的几个方面

提升网络安全防御能力对于个人和组织来说都至关重要。网络安全是一个全面的概念&#xff0c;包括保护个人信息、防止恶意攻击和确保网络资源的安全。在这篇文章中&#xff0c;我将介绍几个方面来提高网络安全防御能力其中包括IP地址查询。 首先&#xff0c;IP地址查询是一种网…

Uniapp中使用uQRCode二维码跳转小程序页面

下载插件 uQRCode官网地址 引入插件 文件如下 //--------------------------------------------------------------------- // github https://github.com/Sansnn/uQRCode //---------------------------------------------------------------------let uQRCode = {};(functio…

colab使用(基础入门)——随手记

挂载到google drive 挂载目录/content/drive from google.colab import drive drive.mount(/content/drive) 图解colab读取Google Drive 文件 - 知乎 下载文件 !curl -L https://dl.fbaipublicfiles.com/imagebind/imagebind_huge.pth -o imagebind_ckpt参数&#xff1a;[-…

案例精选|菏泽公共交通集团日志审计系统建设方案

菏泽公共交通集团有限公司成立于1977年&#xff0c;是市属国有大型公益性企业。随着公交优先政策的出台和企业内部改革的不断深化&#xff0c;菏泽公交集团事业有了飞速发展。 随着5G、大数据、人工智能等数字化技术不断深化应用&#xff0c;近年来菏泽公交集团持续推进智慧公…

简述视频智能分析EasyCVR视频汇聚平台如何通过“AI+视频融合”技术规避八大特殊作业风险

视频智能分析EasyCVR视频汇聚平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储磁盘阵列、录…

动态内存申请

动态内存申请 静态分配 1、 在程序编译或运行过程中&#xff0c;按事先规定大小分配内存空间的分配方式。int a [10] 2、 必须事先知道所需空间的大小。 3、 分配在栈区或全局变量区&#xff0c;一般以数组的形式。 4、 按计划分配 动态分配 1、在程序运行过程中&#xff0c…

十八、MySQL添加外键?

1、外键 外键是用来让两张表的数据之间建立联系&#xff0c;从而保证数据的一致性和完整性。 注意&#xff0c;主表被关联的字段类型&#xff0c;必须和副表被关联的字段类型一致。 2、实际操作 &#xff08;1&#xff09;初始化两张表格&#xff1a; &#xff08;2&#x…

线程、并发相关---第六篇

系列文章目录 文章目录 系列文章目录一、为什么用线程池?解释下线程池参数?二、简述线程池处理流程一、为什么用线程池?解释下线程池参数? 1、降低资源消耗;提高线程利用率,降低创建和销毁线程的消耗。 2、提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线…

银行卡四要素验证API接口文档:支持手机号归属地验证

随着互联网和电商业务的不断发展&#xff0c;人们对于数字化支付方式的需求越来越强烈&#xff0c;因此银行卡验证成为了重要的支付安全措施。银行卡四要素验证API接口&#xff0c;就是为了解决这一问题而开发的。本文将针对银行卡四要素验证API接口&#xff0c;以支持手机号归…

Jetsonnano B01 笔记2:GPIO库-Pycharm远程调试-点灯

今日继续我的Jetsonnano 学习之路,今日主要学习使用Pycharm远程调试Jetsonnano以及驱动使用Jetsonnano的GPIO库&#xff0c;最终尝试使用jetson点亮第一个LED。 本文搬运成分较多&#xff0c;因为Jetsonnano资料比较少&#xff0c;做这些笔记方便自己以及大家查阅。 目录 一…

什么是IIFE(Immediately Invoked Function Expression)?它有什么作用?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐IIFE 的基本语法⭐IIFE 的主要作用⭐如何使用 IIFE 来创建私有变量和模块封装⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅…

【Unity】Unity坑的集锦之RenderTexture打包黑屏

问题&#xff1a;Camera Output Texture设置RenderTexture后&#xff0c;打包用来Save PNG&#xff0c;黑屏 如果你打AB 包&#xff0c;然后是相机的OutputTexture是拖拽的话&#xff0c;记得将包一起打入 或者你可以代码赋值 Camera.targetTexture await Loader.LoadAsset&l…