笔记89:LeetCode_135_分发糖果

前言:


注:代码随想录中没有很清楚的提起想出方法的思路,只是给出了解决这个问题的大致思路和代码;下面我将介绍一下我的思考过程,并贴出实现代码;


a

a

a

a

思考过程:


思路1:为了可以直观理解,我们将评分数组ratings画成折线图,并举几个样例加深理解

注意1:我们可以发现,如果出现一段评分相同的情况,那么评分相同这一段的中间那些节点可以无脑选择赋值为1;

注意2:对于峰值的赋值,如样例3,需要找到离这个波峰最近的两个波谷,从1开始加直到这个波峰,最终比较谁的值大就选谁,因为每个孩子最少一个糖,所以我们要保证波峰沿着最长的路径下降时,下降到最底下还有1来兜底;

a

a

思路2:所以我们的思路转变为如何通过评分数组 ratings 来得到所有的波峰波谷

  • 知道波谷的位置,我们才知道哪些位置应该直接赋值为1,即所有的波谷可以无脑赋值为1;
  • 知道波峰的位置,我们才能通过波峰的位置,找到该波峰左右两边各一个离这个波峰最近的波谷的位置,然后对比两个波谷谁离波峰最远,就选哪个开始一路上升(+1)来给波峰赋值;即样例3表示的情况;

a

a

思路3:所有的折线情况一共有6种,我们判断这6种情况中哪些位置是波峰,哪些位置是波谷?

注意:元素类型分为三类(图中未给出类型的元素即为第3类元素)

  • 波峰
  • 波谷
  • 既不是波峰,也不是波谷

a

a

思路4:如果我们按照上面的6种情况来写我们的代码,先不说还要考虑开头和结尾的特殊情况,就堪堪这六种情况,我tm都想把键盘砸了;所以不可能从头到尾遍历ratings中所有的元素一次,就可以将每个元素的类别(波峰 / 波谷 / 既不是峰也不是谷)给分清楚;

思路5:所以我们另辟蹊径,还是根据我最上面提供的样例3,如果想给波峰赋值,我们需要在两个方向的波谷同时往波峰出发,对波峰赋值,所以我们可不可以?先走【波谷 --> 波峰】这条路,给波峰赋值;再走【波峰 <--  波谷】对波峰赋值;然后选择最大的那个值作为波峰真正的值?

思路6:那么我们可以将遍历一次改成遍历两次数组ratings,第一次遍历为【从左往右】,第二次遍历为【从右往左】,然后记录两次遍历的值,选择最大的值为该节点的值;

注意:不止是波峰可以这样处理,所有的节点都是这样的处理流程;


a

a

a

a

代码实现:


class Solution {
public:
    int candy(vector<int>& ratings) {
        //自己尝试:贪心算法
        vector<int> result(ratings.size(), 1);

        //正向遍历:
        for(int i = 1; i < ratings.size(); i++) {
            if(ratings[i] > ratings[i - 1]) result[i] = result[i - 1] + 1;
        }

        //反向遍历:
        for(int i = ratings.size() - 2; i >= 0; i--) {
            if(ratings[i] > ratings[i + 1]) result[i] = max(result[i + 1] + 1, result[i]);
        }

        //求总和:
        int sum = 0;
        for(int i = 0; i < result.size(); i++) {
            sum += result[i];
        }

        return sum;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop3:HDFS中DataNode与NameNode的工作流程

一、DataNode中的数据情况 数据位置 /opt/module/hadoop-3.1.3/data/dfs/data/current/BP-823420375-192.168.31.102-1714395693863/current/finalized/subdir0/subdir0块信息 每个块信息&#xff0c;由两个文件保存&#xff0c;xxx.meta保存的是数据长度、校验和、时间戳&am…

【halcon】set_part 实现平移和缩放 彻悟版

背景 之前写了一篇关于set_part 的文章 &#xff0c;确实也实现了平移和缩放。平移是对的&#xff0c;但是缩放其实有畸变。这个问题一直都困扰着我&#xff0c;知道昨天连续测试了好几个小时&#xff0c;直到晚上11点终于完美解决。 坐标和高宽 坐标 再讲set_part 之前&am…

C语言实现三子棋游戏

目录 一.三子棋游戏分析和设计 二.文件结构设计 三.代码实现 1.先打印菜单&#xff0c;定义menu函数。 2.棋盘初始化 3.下棋 玩家下棋&#xff1a; 电脑下棋&#xff1a; 4判断输赢 判断平局&#xff1a; 四、完整代码 test.c game.h game.c 《三子棋》是一款古老…

【找出满足差值条件的下标 I】python

目录 暴力题解 优化&#xff1a;滑动窗口维护大小值 暴力题解 class Solution:def findIndices(self, nums: List[int], indexDifference: int, valueDifference: int) -> List[int]:nlen(nums)for i in range(n):for j in range(n-1,-1,-1):if abs(i-j)>indexDiffere…

python使用base加密解密

原理 base编码是一种加密解密措施&#xff0c;目前常用的有base16、base32和base64。其大致原理比较简单。 以base64为例&#xff0c;base64加密后共有64中字符。其加密过程是编码后将每3个字节作为一组&#xff0c;这样每组就有3*824位。将每6位作为一个单位进行编码&#xf…

Windows平台C#版RTSP转RTMP直播推送定制版

技术背景 前几年我们发布了C版的多路RTMP/RTSP转RTMP转发官方定制版。在秉承低延迟、灵活稳定、低资源占用的前提下&#xff0c;客户无需关注开发细节&#xff0c;只需图形化配置转发等各类参数&#xff0c;实现产品快速上线目的。 如监控类摄像机、NVR等&#xff0c;通过厂商…

经典链表题-链表回文结构

&#x1f389;&#x1f389;&#x1f389;欢迎莅临我的博客空间&#xff0c;我是池央&#xff0c;一个对C和数据结构怀有无限热忱的探索者。&#x1f64c; &#x1f338;&#x1f338;&#x1f338;这里是我分享C/C编程、数据结构应用的乐园✨ &#x1f388;&#x1f388;&…

C#基础语言

​​​​ 目录 一个c# 程序主要包括以下部分&#xff1a;​​​​​​​ 标识符 C# 关键字 C# 数据类型 值类型&#xff08;Value types&#xff09; 引用类型&#xff08;Reference types&#xff09; 对象&#xff08;Object&#xff09;类型 动态&#xff08;Dynam…

迅睿 CMS 中开启【ionCube 扩展】的方法

有时候我们想要某种功能时会到迅睿 CMS 插件市场中找现有的插件&#xff0c;但会有些担心插件是否适合自己的需求。于是迅睿 CMS 考虑到这一层推出了【申请试用】&#xff0c;可以让用户申请试用 30 天&#xff0c;不过试用是有条件的&#xff0c;条件如下&#xff1a; php 版…

03. Spring 事务管理

文章目录 1. Spring 事务管理简介2. Transactional 注解属性信息3. Transactional 简单使用4. Transactional 使用注意事项4.1 正确指定事务回滚的异常类型4.1.1 Java 异常继承体系 4.2 Transactional 注解应用在 public 方法或类上才有效4.3 正确设置 Transactional 的 propag…

解决vue3项目vite打包忽略.vue扩展名

项目打包时报could not relolve “...”&#xff0c;因为vite已不再默认忽略.vue扩展名。 解决方法如下&#xff1a; 在vite.config.js中配置vite使其忽略 .vue 扩展名&#xff08;不建议忽略&#xff09; 注意&#xff1a;即使忽略了.vue文件&#xff0c;在实际写的时候也要加…

【CTF Web】CTFShow web7 Writeup(SQL注入+PHP+进制转换)

web7 1 阿呆得到最高指示&#xff0c;如果还出问题&#xff0c;就卷铺盖滚蛋&#xff0c;阿呆心在流血。 解法 注意到&#xff1a; <!-- flag in id 1000 -->拦截很多种字符&#xff0c;连 select 也不给用了。 if(preg_match("/\|\"|or|\||\-|\\\|\/|\\*|\…

Spring MVC+mybatis 项目入门:旅游网(一)项目创建与准备

个人博客&#xff1a;Spring MVCmybatis 项目入门:旅游网&#xff08;一&#xff09;项目创建与准备 | iwtss blog 先看这个&#xff01; 这是18年的文章&#xff0c;回收站里恢复的&#xff0c;现阶段看基本是没有参考意义的&#xff0c;技术老旧脱离时代&#xff08;2024年辣…

使用不同的编译器编译 Skia,性能差距居然这么大

Skia 是一个开源的 2D 图形库&#xff0c;提供路径、文本、图像和渲染等图形处理功能。它最初由 Skia Inc. 开发&#xff0c;后来被 Google 收购&#xff0c;并用在多个 Google 的产品中&#xff0c;包括 Chrome 浏览器和 Android 操作系统中。从事 Android 系统开发的同学应该…

Science 基于尖峰时序编码的模拟神经触觉系统,可实现动态对象分类

快速处理和有效利用手与物体交互过程中产生的动态触觉信号&#xff08;例如触摸和抓握&#xff09;对于触觉探索和灵巧的物体操作至关重要。将电子皮肤&#xff08;e-skins&#xff09;推进到模仿自然触觉的水平&#xff0c;是恢复截肢者和瘫痪患者丧失的功能的可行解决方案&am…

北核论文完美复现:自适应t分布与动态边界策略改进的算术优化算法

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原始算术优化算法 改进点1&#xff1a;引入…

深入探索MySQL SELECT查询:从基础到高级,解锁数据宝藏的密钥

系列文章目录 更新ing... MySQL操作全攻略&#xff1a;库、表、数据、事务全面指南深入探索MySQL SELECT查询&#xff1a;从基础到高级&#xff0c;解锁数据宝藏的密钥MySQL SELECT查询实战&#xff1a;练习题精选&#xff0c;提升你的数据库查询技能PyMySQL&#xff1a;连接P…

【电路笔记】-巴特沃斯滤波器设计

巴特沃斯滤波器设计 文章目录 巴特沃斯滤波器设计1、概述2、Decades和Octaves3、低通巴特沃斯滤波器设计4、滤波器设计 – 巴特沃斯低通5、三阶巴特沃斯低通滤波器在之前的滤波器教程中,我们研究了简单的一阶型低通和高通滤波器,这些滤波器的 RC 滤波器电路设计中仅包含一个电…

Ant design vue的表格双击编辑功能(即双击开始编辑并自动获得焦点,失去焦点时完成编辑)

本文基于Ant Design Vue官方网站的表格&#xff08;可编辑单元格&#xff09;&#xff08;表格 Table - Ant Design Vue (antdv.com))中的样板代码获得双击编辑且获得焦点、失去焦点时完成编辑的功能。 要点&#xff1a; &#xff08;1&#xff09;双击时候实现编辑&#xff…

spark实战:实现分区内求最大值,分区间求和以及获取日志文件固定日期的请求路径

spark实战&#xff1a;实现分区内求最大值&#xff0c;分区间求和以及获取日志文件固定日期的请求路径 Apache Spark是一个广泛使用的开源大数据处理框架&#xff0c;以其快速、易用和灵活的特点而受到开发者的青睐。在本文中&#xff0c;我们将通过两个具体的编程任务来展示S…