代码随想录:贪心算法

455. 分发饼干

解题步骤

  1. 排序:给两个数组排序
  2. 举例判断:看第一个情况不满足,要换孩子还是换物品?
    a. 换孩子→遍历孩子
    b. 换物品→遍历物品

实战:

  1. 选择从小到大排序
  2. 第一个不满足,我要换物品。因为换了孩子还是不满足。
  3. 确定了遍历顺序:换物品→遍历物品

go实现

/*** @date: 2024 Jan 06* @time: 10:50* @author: Chris* @title: 455. Assign Cookies* @link: https://leetcode.cn/problems/assign-cookies/description/
**/
package day31import ("sort"
)// 优先满足胃口小的孩子,
// 如果不可以换下一个物品;如果换孩子的的话也不能满足
func findContentChildren(g []int, s []int) int {// sort by ascendingsort.Ints(g)sort.Ints(s)child := 0// 遍历物品,如果不行换下个物品for sIndex := 0; child < len(g) && sIndex < len(s); sIndex++ {// 物品sIndex在不断递增// child只有满足的当前孩子时候才递增,才会尝试分配给下一个孩子if s[sIndex] >= g[child] {child++}}return child
}// 优先满足胃口大的孩子,
// 如果不行,换下个孩子; 如果换下一个物品的话也不能满足。
func findContentChildren2(g []int, s []int) int {// sortsort.Ints(g)sort.Ints(s)sIndex := len(s) - 1// 遍历孩子,如果不行换孩子for i := len(g) - 1; sIndex >= 0 && i >= 0; i-- {// 孩子可能大于饼干数,注意sIndex别越界if  s[sIndex] >= g[i] {sIndex--}}return (len(s) - 1) - sIndex
}

55. 跳跃游戏

/*** @date: 2024 Jan 06* @time: 13:32* @author: Chris* @title: 55. Jump Game* @link: https://leetcode.cn/problems/jump-game/description/
**/
package day32// 跳跃覆盖范围究竟可不可以覆盖到终点!
func canJump(nums []int) bool {if len(nums) == 1 {return true}// 记录 能到达的最大的位置cover := 0// 注意这里i的范围是cover,是能到达的距离!超过这个距离不能到达for i := 0; i <= cover; i++ {// 更新cover = (当前位置+跳跃距离, 旧cover)cover = max(i+nums[i], cover)if cover >= len(nums)-1 {return true}}return false
}

45. 跳跃游戏 II

思路:

记录步骤的规则: 每超过上一次可达最大范围,需要跳跃一次。
所以 在i==上一次可达范围+1的位置进行记录,次数+1
if (i == lastDistance + 1) minSetp++;

从题目中可知:一开始到达了nums[0]位置,从nums[1]记录一次!
然后题目确保了可到达尾巴nums[n-1]。

/*** @date: 2024 Jan 06* @time: 13:44* @author: Chris* @title: 45. Jump Game II* @link: https://leetcode.cn/problems/jump-game-ii/description/
**/
package day32// 记录步骤规则:每超过上一次可达最大范围,需要跳跃一次,次数+1
// 记录位置:i == lastDistance + 1
func jump(nums []int) int {// 根据题目规则,初始位置为nums[0]lastDistance := 0 // 上一次覆盖范围curDistance := 0  // 当前覆盖范围(可达最大范围)minStep := 0      // 记录最少跳跃次数for i := 0; i < len(nums); i++ {if i == lastDistance+1 { // 在上一次可达范围+1的位置,记录步骤minStep++                  // 跳跃次数+1lastDistance = curDistance // 记录时才可以更新}curDistance = max(nums[i]+i, curDistance) // 更新当前可达的最大范围}return minStep
}

135. 分发糖果

1. 初始化每人一个糖果

2. 确保每个比左邻居评分高的孩子,比左邻居多一颗糖果。
a. 从左向右遍历–>,和右邻居比较

💡 因为判断是基于左邻居,应先确定左边,所以从左到右遍历

3. 确保每个比右邻居评分高的孩子,比右邻居多一颗糖果。
a. 从右向左遍历<–,和右邻居比较

💡 判断基于右邻居,右边的状态先确定,所以从右向左遍历
/*** @date: 2024 Jan 06* @time: 17:16* @author: Chris* @title: 135. Candy* @link: https://leetcode.cn/problems/candy/
**/
package day34func candy(ratings []int) int {n := len(ratings)if n == 0 {return 0}// 初始化,每人一个糖candies := make([]int, n)for i := range candies {candies[i] = 1}// 确保每个比左邻居评分高的孩子,比左邻居多一颗糖果。// 从左到右 --->for i := 1; i < n; i++ {//评分比左侧高!if ratings[i] > ratings[i-1] {// 比左侧多一个candies[i] = candies[i-1] + 1}}// 确保每个比右邻居评分高的孩子,比右邻居多一颗糖果。// 从右到左  <---for i := n - 2; i >= 0; i-- {//评分比右侧高!  如果糖果少的话再操作,糖果多不要操作,可能会减少糖果!// 比如 [1,2,3,1] 糖果数[1,2,3,1],不加这个条件3就变成2了!if ratings[i] > ratings[i+1] && candies[i] <= candies[i+1] {candies[i] = candies[i+1] + 1}}total := 0for _, c := range candies {total += c}return total
}

细节:

左到右→: i =1

右到左←: i = n-2

为什么是评分比较不包含=符号?

题目要求比邻居高,糖果比邻居糖果多,
如果相等(即不比邻居高),那么可以不比邻居多。
比如: ratings[1, 2, 2] 糖果为:[1, 2, 1]

为什么第二次循环多加了一个candies[i] <= candies[i+1]判断,如果不判断有什么后果?

如果当前孩子比右邻居糖果还进行操作,可能会减少糖果!从而导致违背第一次遍历要求!
比如ratings [1,2,3,1] 第一次遍历糖果数[1,2,3,1]
不加这个条件,遍历[1,2,3,1],3就会变成2了!不满足糖果数大于左邻居!

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

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

相关文章

AIGC带给开发者的冲击

未来会有两种开发者&#xff0c;一种是会使用AIGC工具的开发者另一种是不会使用AIGC的开发者&#xff0c;AIGC的出现提高了开发效率和代码质量&#xff0c;对开发者意味着需要不断学习和适应新的技术和工作范式&#xff0c;开发者可以把更多的精力放在高级抽象的定义以及更高维…

【C程序设计】C enum(枚举)

枚举是 C 语言中的一种基本数据类型&#xff0c;用于定义一组具有离散值的常量&#xff0c;它可以让数据更简洁&#xff0c;更易读。 枚举类型通常用于为程序中的一组相关的常量取名字&#xff0c;以便于程序的可读性和维护性。 定义一个枚举类型&#xff0c;需要使用 enum 关…

JS的防抖和节流

目录 防抖 搜索框带来的问题 实现的思路 案例 封装防抖函数 节流 滚动条加载带来的问题 实现的思路 案例 封装节流函数 防抖 搜索框带来的问题 需求&#xff1a;根据输入框内容来请求数据 <!DOCTYPE html> <html lang"en"> <head><…

STHS34PF80人体存在传感器(1)----获取人体存在状态

STHS34PF80人体存在传感器.1--获取人体存在状态 概述视频教学样品申请完整代码下载主要特点硬件准备接口最小系统图生成STM32CUBEMX串口配置IIC配置CS设置串口重定向参考案例获取ID温度测量滤波方式智能识别算法使用块数据更新&#xff08;BDU&#xff09;功能设置ODR速率获取状…

Stable Diffusion架构的3D分子生成模型 GeoLDM - 测评与代码解析

之前&#xff0c;向大家介绍过3D分子生成模型 GeoLDM。 GeoLDM按照Stable Diffusion架构&#xff0c;将3D分子生成的扩散过程运行在隐空间内&#xff0c;优化了基于扩散模型的分子生成。可能是打开Drug-AIGC的关键之作。让精确控制分子生成有了希望。 详见&#xff1a;分子生成…

Python 中的==操作符 和 is关键字

Python是一种功能强大的通用编程语言&#xff0c;提供了各种比较值和对象的方法。其中包括操作符和is关键字&#xff0c;它们的用途不同&#xff0c;但由于它们有时可以达到相同的目的&#xff0c;所以经常会被混淆。在本文中&#xff0c;我们将深入研究和is之间的区别&#xf…

C++入门基本语法

目录 前言 一.命名空间 1.命名空间定义 2.命名空间的使用 3.展开命名空间 二.缺省函数 三.函数重载 四.引用 1.特性 2.使用场景 3.效率及实现 前言 欢迎来到C的世界&#xff01;C是一种广泛使用的计算机编程语言&#xff0c;它提供了丰富的功能&#xff0c;包括面向…

海外分支访问国内服务器系统慢怎么办?

在全球业务不断扩张的今天&#xff0c;企业面临着海外分支访问国内总部服务器系统慢的问题。为了解决这一挑战&#xff0c;我们引入了lxway全球系统专网产品&#xff0c;为企业提供高效、安全的全球网络连接方案。通过解析技术瓶颈和专网的优势&#xff0c;本文将揭示如何借助先…

设计模式之过滤器模式

目录 1.简介 2.过滤器的实现 2.1.过滤器的角色 2.2.类图 2.3.具体实现 3.过滤器模式的优点 4.过滤器模式的不足 5.适用的场景 1.简介 过滤器模式&#xff08;Filter Pattern&#xff09;或标准模式&#xff08;Criteria Pattern&#xff09;是一种结构型设计模式&…

【Python学习】Python学习3-变量类型

目录 【Python学习】Python学习3 前言变量赋值多个变量赋值标准数据类型Python Numbers(数字)Python List&#xff08;列表&#xff09;Python Tuple&#xff08;元组&#xff09;Python Dictionary&#xff08;字典&#xff09; Python数据类型转换总结参考 文章所属专区 Py…

【数据库原理】(9)SQL简介

一.SQL 的发展历史 起源&#xff1a;SQL 起源于 1970 年代&#xff0c;由 IBM 的研究员 Edgar F. Codd 提出的关系模型概念演化而来。初期&#xff1a;Boyce 和 Chamberlin 在 IBM 开发了 SQUARE 语言的原型&#xff0c;后发展成为 SQL。这是为了更好地利用和管理关系数据库。…

基于albert的汽车评论情感分析【含代码】

汽车评论情感分析 汽车评论情感数据集代码加载库与参数设置数据集的读取超参数设置与数据集的构建模型的训练与验证 汽车评论情感数据集 链接&#xff1a;https://pan.baidu.com/s/1K5TWrXbXBRXkCUpMbZq2XA 提取码&#xff1a;9mt9 代码 加载库与参数设置 首先先把一些基础…

C#使用条件语句判断用户登录身份

目录 一、示例 二、生成 利用条件语句判断用户登录身份&#xff0c;根据用户登录身份的不同&#xff0c;给予相应的操作权限。 一、示例 主要用if语句及ComboBox控件。其中&#xff0c;ComboBox是窗体中的下拉列表控件&#xff0c;在使用ComboBox控件前&#xff0c;可以先向…

YoloV7改进策略:基于频域多轴表示学习模块|全网首发|高效涨点|代码注释详解

摘要 涨点效果: 本文尝试使用频域多轴表示学习模块改进YoloV7,尝试了三种改进方式,均有不同的涨点。 论文:《医学图像分割中的频域多轴表示学习》 https://arxiv.org/pdf/2312.17030v1.pdf 最近,视觉Transformer (ViT)在医学图像分割(MIS)中得到了广泛应用,这归功于…

springboot实现ChatGPT式调用(一次调用,持续返回)

下边实现了一个持续返回100以内随机数的接口&#xff0c;在接口超时之前会每隔1秒返回一个随机数 GetMapping(value "/getRandomNum", produces MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter getRandomNum() {SseEmitter emitter new SseEmitter();Th…

【airsim】python控制airsim

使用airsim 1.8.1编译完成&#xff0c;进过block项目在cpp测试后&#xff0c;开始踩坑使用python。 使用AirSim\PythonClient\setup.py或者pip安装airsim。 python setup.py install或者 pip install airsim此时&#xff0c;windows电脑的环境信息 (air_py38) D:\code\Gith…

如何计算CAN通信波特率

目录 1、理论 2、实践 3、注意事项 在CAN总线系统中&#xff0c;波特率的计算是一个关键步骤&#xff0c;它确保网络上的所有设备能够以相同的速率进行通信。 1、理论 波特率的计算涉及到几个关键参数&#xff0c;包括CAN控制器的时钟频率、分频因子、以及位时间的不同部分…

vue icon 本地正常 线上打包失败变乱码

出现这个原因是因为sass解析的问题 Node版本高的话可以通过升级sass版本 并且配置vue.config规避这个问题 //给sass配置的东西 这个对应的版本是sass 1.39.0 本人node版本v14 升级sass版本后出现报错css: {loaderOptions: {scss: {additionalData: import "/styles/var…

JVM知识总结(简单且高效)

1. JVM内存与本地内存 JVM内存&#xff1a;受虚拟机内存大小的参数控制&#xff0c;当大小超过参数设置的大小时会报OOM。本地内存&#xff1a;本地内存不受虚拟机内存参数的限制&#xff0c;只受物理内存容量的限制&#xff1b;虽然不受参数的限制&#xff0c;如果所占内存超过…

软件工程概论------文件管理

目录 1.文件的相关概念 2.文件目录 3.位示图 4.索引文件 5.例题 1.文件的相关概念 文件:具有符号名的、在逻辑上具有完整意义的一组相关信息项的集合。 逻辑结构:有结构的记录式文件、无结构的流式文件。 物理结构: 连续结构、链接结构、索引结构、多个物理块的索引表。 …