【编程之路】面试必刷TOP101:贪心算法(95-96,Python实现)

2023-10-26

面试必刷TOP101:贪心算法(95-96,Python实现)

95.分糖果问题(小试牛刀

95.1 贪心思想

要想分出最少的糖果,利用贪心思想,肯定是相邻位置没有增加的情况下,大家都分到1,相邻位置有增加的情况下,分到糖果数加1就好。什么情况下会增加糖果,相邻位置有得分差异,可能是递增可能是递减,如果是递增的话,糖果依次加1,如果是递减糖果依次减1?这不符合最小,因为减到最后一个递减的位置可能不是1,必须从1开始加才是最小,那我们可以从最后一个递减的位置往前反向加1。

step 1:使用一个辅助数组记录每个位置的孩子分到的糖果,全部初始化为 1。
step 2:从左到右遍历数组,如果右边元素比相邻左边元素大,意味着在递增,糖果数就是前一个加 1,否则保持 1 不变。
step 3:从右到左遍历数组,如果左边元素比相邻右边元素大, 意味着在原数组中是递减部分,如果左边在上一轮中分到的糖果数更小,则更新为右边的糖果数 +1,否则保持不变。
step 4:将辅助数组中的元素累加求和。
在这里插入图片描述

class Solution:
    def candy(self , arr: List[int]) -> int:
        # 记录每个位置的糖果数,初始为 1
        nums = [1] * len(arr)
        # 从左到右遍历
        for i in range(1,len(arr)):
            # 如果右边在递增,每次增加一个
            if arr[i] > arr[i-1]:
                nums[i] = nums[i-1] + 1
        i = len(arr) - 2
        # 从右到左遍历
        for i in range(len(arr)-2,-1,-1):
            # 如果左边更大但是糖果数更小
            if arr[i] > arr[i+1] and nums[i] <= nums[i+1]:
                nums[i] = nums[i+1] + 1
        return sum(nums)

时间复杂度: O ( n ) O(n) O(n),单独遍历两次。
空间复杂度: O ( n ) O(n) O(n),记录每个位置糖果数的辅助数组。

96.主持人调度(二)(小试牛刀

96.1 排序+遍历

我们利用贪心思想,什么时候需要的主持人最少?那肯定是所有的区间没有重叠,每个区间首和上一个的区间尾都没有相交的情况,我们就可以让同一位主持人不辞辛劳,一直主持了。但是题目肯定不是这种理想的情况,那我们需要对交叉部分,判断需要增加多少位主持人。

step 1: 利用辅助数组获取单独各个活动开始的时间和结束时间,然后分别开始时间和结束时间进行排序,方便后面判断是否相交。
step 2: 遍历 n 个活动,如果某个活动开始的时间大于之前活动结束的时候,当前主持人就够了,活动结束时间往后一个。
step 3: 若是出现之前活动结束时间晚于当前活动开始时间的,则需要增加主持人。

不理解可以画图!

class Solution:
    def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
        start = []
        end = []
        # 分别得到活动起始时间
        for i in range(n):
            start.append(startEnd[i][0])
            end.append(startEnd[i][1])
        # 分别对开始和结束时间排序
        start.sort()
        end.sort()
        res = 0
        j = 0
        for i in range(n):
            # 新开始的节目大于上一轮结束的时间,主持人不变
            if start[i] >= end[j]:
                j = j + 1
            else:
                # 主持人增加
                res = res + 1
        return res

时间复杂度: O ( n l o g 2 n ) O(nlog_2n) O(nlog2n),遍历都是 O ( n ) O(n) O(n),sort排序为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)
空间复杂度: O ( n ) O(n) O(n),辅助空间记录开始时间和结束时间的数组

该问题类比于:同一时间最多重叠区间个数。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【编程之路】面试必刷TOP101:贪心算法(95-96,Python实现) 的相关文章

随机推荐

  • npm 和 yarn 命令对照表

    以typescript为例子 初始化项目 npm init yarn init 根据package json安装 npm install yarn 安装具体的包 npm install typescript yarn add typescr
  • Java课题笔记~ ServletConfig

    概念 代表整个web应用 可以和程序的容器 服务器 来通信
  • 2023自动化测试的10个最佳实践(建议收藏)

    虽然大家都知道坚果是非常健康和有营养的 但是 当你尝试吃它的时候 我猜测过程都不会很顺利 现实就是那么相似 我们都知道测试自动化对软件开发有好处 就像坚果对我们的身体一样 很遗憾很多公司在不考虑细微差别的情况下就赶着上线测试自动化 如果您不
  • 中国剩余定理(孙子定理)

    看了很多博客始终没弄明白中国剩余定理到底是怎么算出来的 看孙子的话完全是一脸懵逼啊 还好有这个博客大神的博客Orz 真的讲的特别清晰 点赞点赞 下面会用到的数学公式 如果a b c 那么如果x b c 2 此时x a 2 也就是说除数相等时
  • keil警告 LED.C(38): warning C276: constant in condition expression

    出现此警告一般是由于把if a 3 写成了if a 3 即少写了一个 号 不能作为判断条件
  • 音频处理——详解PCM数据格式

    目录 知识储备 什么是PCM 采样 采样率 重采样 量化 编码 PCM常用指标 PCM数据流 知识储备 音频处理 音频编码原理简介 音频处理 音频处理的基本概念 什么是PCM PCM全称Pulse Code Modulation 翻译一下是
  • yolov5剪枝开源分享

    剪枝分软剪枝和硬剪枝 软剪枝的概念来源于Soft Filter Pruning SFP 这篇论文 下图阐述了软剪枝 SFP 和硬剪枝 Hard Filter Pruning HFP 的区别 它们的不同点是HFP在每个epoch后会将卷积核直
  • 小米路由器R4A(千兆版)固件刷opewrt、刷官方固件

    文章目录 前言 一 刷openwrt 1 获取root权限 2 刷入breed 3 刷入openwtr固件 二 恢复官方固件 1 进入breed界面 2 设置电脑IP 3 固件恢复 三 拯救砖机 总结 前言 最近新买一台小米路由器 老的那台
  • 关于单例模式的一个坑

    问题 有一种情景 单例实例化对象需要在网络通信的通道建立好之后 如果使用饿汉模式 程序开始执行 上来先实例化一个 也不管后面用不用得到 饿汉模式 ifndef SINGLETON define SINGLETON class Singlet
  • python mesa包教程

    python中的mesa包预制了一些类 提供了一些基础模型 可以大大简化abm建模的工作量 在python中实现 也有利于和其它算法相结合 本文是一次作业 按照个人理解把mesa包教程整理 代码压缩成了两大部分 如果是新手上手 建议查看下方
  • 基于js的炫酷动画的代码

  • 提领类型双关的指针将破坏重叠规则——strict-aliasing

    转载请保留本行原始出处声明信息 http www zeali net entry 454 MaDe1nZEAL warning dereferencing type punned pointer will break strict alia
  • 怎么理解离散数据?

    离散数据是指数据值只能取有限的 可数的数值 而不能取到连续的数值 相对的 连续数据可以取到任意数值 离散数据是在一个固定的集合中取值 集合通常是整数集或有限的枚举集 例如 一个人的家庭成员数量就是一个离散数据 它只能取到整数值 如0 1 2
  • JS的类型转换和float取n位小数

    javascript中的变量都是弱类型 所有的变量都声明为var 在类型转换过程中就没有java那么方便 它是通过 parseInt 变量 parseFloat 变量 等方法来进行类型转换的 注意 没有parseDouble 变量 这种类型
  • k8s deployment Strategy 更新策略

    k8s更新策略 https kubernetes io zh docs concepts workloads controllers deployment Strategy spec strategy specifies the strat
  • vue修改富文本中的元素样式

    富文本编辑器目前应用很广泛 而有时候我们想要对其中的一些元素的样式进行修改 就会遇到问题 首先 直接修改是不可行的 因为是用v html标签进行渲染的 无法直接获取到 在修改的时候 一般是按标签进行修改 当然 也可以按class和id等 这
  • python:从键盘输入学生的成绩,转换成 5 个等级输出。A(90~100),B(80~89),C(70~79),D(60~69),E(0~59)。试用嵌套分支结构实现。

    grades eval input 请输入你的成绩 if 90 lt grades lt 100 print A elif 80 lt grades lt 90 print B elif 70 lt grades lt 79 print C
  • 前置机

    前置机这个概念一般在银行 券商 电信运营商那里用的比较多 这些地方都有很多后台核心处理系统 对外提供各种接口服务 如果我有某种业务接口需要跟他们的后台系统打交道 要从我们的外部网络访问他们的后台系统 这些单位是绝对不允许的 这个时候 他们要
  • Unity中协程与线程的区别

    本文转载自 https blog csdn net qq 25122429 article details 80481443 协同程序 coroutine 与多线程情况下的线程比较类似 有自己的堆栈 自己的局部变量 有自己的指令指针 IP
  • 【编程之路】面试必刷TOP101:贪心算法(95-96,Python实现)

    面试必刷TOP101 贪心算法 95 96 Python实现 95 分糖果问题 小试牛刀 95 1 贪心思想 要想分出最少的糖果 利用贪心思想 肯定是相邻位置没有增加的情况下 大家都分到1 相邻位置有增加的情况下 分到糖果数加1就好 什么情