深圳做响应式网站公司/中铁建设集团有限公司

深圳做响应式网站公司,中铁建设集团有限公司,新疆工商局办事大厅,做网站公司哪里好n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果,计算并返回需要准备的 最…

 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

方法一:贪心算法

function candy(ratings: number[]): number {const n = ratings.length;const candies = new Array(n).fill(1);// 从左到右遍历,保证右边评分高的孩子糖果多for (let i = 1; i < n; i++) {if (ratings[i] > ratings[i - 1]) {candies[i] = candies[i - 1] + 1;}}// 从右到左遍历,保证左边评分高的孩子糖果多for (let i = n - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1] && candies[i] <= candies[i + 1]) {candies[i] = candies[i + 1] + 1;}}// 计算糖果总数let total = 0;for (const candy of candies) {total += candy;}return total;
}// 示例调用
const ratings = [1, 0, 2];
const result = candy(ratings);
console.log("需要准备的最少糖果数目:", result);

代码解释

  1. 初始化糖果数组:创建一个长度为 n 的数组 candies,并将每个元素初始化为 1,表示每个孩子至少分配到 1 个糖果。
  2. 从左到右遍历:通过 for 循环从索引 1 到 n - 1 遍历数组。如果当前孩子的评分 ratings[i] 大于左边孩子的评分 ratings[i - 1],则将当前孩子的糖果数 candies[i] 设置为左边孩子糖果数 candies[i - 1] 加 1,以满足相邻孩子评分更高的孩子获得更多糖果的条件。
  3. 从右到左遍历:再通过 for 循环从索引 n - 2 到 0 反向遍历数组。如果当前孩子的评分 ratings[i] 大于右边孩子的评分 ratings[i + 1],并且当前孩子的糖果数 candies[i] 小于等于右边孩子的糖果数 candies[i + 1],则将当前孩子的糖果数 candies[i] 设置为右边孩子糖果数 candies[i + 1] 加 1,进一步保证满足条件。
  4. 计算糖果总数:遍历 candies 数组,将每个孩子的糖果数累加到变量 total 中,最后返回 total,即需要准备的最少糖果数目。

复杂度分析

  • 时间复杂度:(O(n)),其中 n 是孩子的数量。代码中进行了两次遍历数组的操作,每次遍历的时间复杂度都是 (O(n)),最后计算糖果总数的遍历时间复杂度也为 (O(n)),所以总的时间复杂度为 (O(n))。
  • 空间复杂度:(O(n)),用于存储每个孩子分配的糖果数的数组 candies 的长度为 n,因此空间复杂度为 (O(n))。

这种贪心算法的思路通过两次遍历,分别从不同方向保证了糖果分配满足条件,从而高效地计算出了最少糖果数目。

方法二:山峰山谷想象法

思路分析

可以将孩子的评分序列看作是一系列的山峰和山谷。对于上升序列(评分递增),糖果数依次递增;对于下降序列(评分递减),糖果数也依次递减;而在山谷处(评分局部最小),糖果数为 1。我们可以通过一次遍历找出所有的上升和下降序列,然后计算每个序列所需的糖果数。

代码实现

function candy(ratings: number[]): number {const n = ratings.length;if (n <= 1) {return n;}let totalCandies = 0;let up = 0; // 上升序列的长度let down = 0; // 下降序列的长度let oldSlope = 0;for (let i = 1; i < n; i++) {// 当前的斜率,1 表示上升, -1 表示下降, 0 表示相等let newSlope = ratings[i] > ratings[i - 1]? 1 : (ratings[i] < ratings[i - 1]? -1 : 0);if ((oldSlope > 0 && newSlope === 0) || (oldSlope < 0 && newSlope >= 0)) {// 当上升序列结束或者下降序列结束时totalCandies += count(up) + count(down) + Math.max(up, down);up = 0;down = 0;}if (newSlope > 0) {up++;} else if (newSlope < 0) {down++;} else {totalCandies++;}oldSlope = newSlope;}// 处理最后一个上升或下降序列totalCandies += count(up) + count(down) + Math.max(up, down) + 1;return totalCandies;
}// 计算长度为 length 的序列所需的糖果数
function count(length: number): number {return (length * (length + 1)) / 2;
}

代码解释

  1. 初始化变量

    • n 为孩子的数量。
    • totalCandies 用于记录总共需要的糖果数,初始化为 0。
    • up 记录当前上升序列的长度,down 记录当前下降序列的长度,初始都为 0。
    • oldSlope 记录上一个位置的斜率,初始为 0。
  2. 遍历评分序列

    • 计算当前位置的斜率 newSlope,如果当前评分大于前一个评分,newSlope 为 1;如果小于,为 -1;如果相等,为 0。
    • 当上升序列结束(oldSlope > 0 && newSlope === 0)或者下降序列结束(oldSlope < 0 && newSlope >= 0)时,计算该上升和下降序列所需的糖果数,并累加到 totalCandies 中,同时重置 up 和 down 为 0。
    • 根据 newSlope 的值更新 updown 或 totalCandies。如果 newSlope 为 1,up 加 1;如果为 -1,down 加 1;如果为 0,totalCandies 加 1。
    • 更新 oldSlope 为 newSlope
  3. 处理最后一个序列

    • 遍历结束后,处理最后一个上升或下降序列,将其所需的糖果数累加到 totalCandies 中。
  4. 计算序列所需糖果数

    • count 函数用于计算长度为 length 的序列所需的糖果数,根据等差数列求和公式 (length * (length + 1)) / 2 计算。

复杂度分析

  • 时间复杂度:(O(n)),其中 n 是孩子的数量。只需要对评分序列进行一次遍历。
  • 空间复杂度:(O(1)),只使用了常数级的额外变量。

这种方法通过直接分析评分序列的上升和下降趋势,避免了两次遍历,在逻辑上更加直观,同时保持了线性的时间复杂度。

 

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

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

相关文章

利用three.js在Vue项目中展示重构的stl模型文件

一、目的 为了在前端页面展示3d打印机打印过程 二、前期准备 完整模型的stl文件和模型切割成的n个stl文件 models文件夹下的文件就是切割后的stl文件 三、代码 <template><div ref"threeContainer" class"three-container"></div><…

搭建数字化生态平台公司:痛点与蚓链解决方案

在数字技术突飞猛进的当下&#xff0c;数字化生态平台成为众多企业实现创新发展、拓展业务版图的 “秘密工具”。今天&#xff0c;咱们就一起来聊聊搭建这类平台的公司&#xff0c;看看它们有啥独特之处&#xff0c;又面临哪些难题。 一、面临的痛点 &#xff08;一&#xff0…

云平台DeepSeek满血版:引领AI推理革新,开启智慧新时代

引言&#xff1a;人工智能的未来——云平台的卓越突破 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正深刻地改变着我们生活与工作方式的方方面面。作为AI领域的创新者与领航者&#xff0c;云平台始终走在技术前沿&#xff0c;凭借无穷的热情…

基于OFDR的层压陆相页岩油储层中非对称裂缝群传播的分布式光纤监测

关键词&#xff1a;OFDR、分布式光纤传感、裂缝传播 一. 概述 四川盆地凉高山组优质页岩油储层存在复杂的垂直重叠岩性&#xff0c;大陆页岩油储层存在发育层理&#xff0c;薄层和天然裂缝&#xff0c;对水平井多级压裂技术的裂缝网络形态控制和监测构成挑战。本研究提出了一…

【大模型】Ubuntu下 fastgpt 的部署和使用

前言 本次安装的版本为 fastgpt:v4.8.8-fix2。 最新版本fastgpt:v4.8.20-fix2 问答时报错&#xff0c;本着跑通先使用起来&#xff0c;就没有死磕下去&#xff0c;后面bug解了再进行记录。   github连接&#xff1a;https://github.com/labring/FastGPT fastgpt 安装说明&…

如何使用Docker搭建哪吒监控面板程序

哪吒监控(Nezha Monitoring)是一款自托管、轻量级的服务器和网站监控及运维工具,旨在为用户提供实时性能监控、故障告警及自动化运维能力。 文档地址:https://nezha.wiki/ 本章教程,使用Docker方式安装哪吒监控面板,在此之前,你需要提前安装好Docker. 我当前使用的操作系…

ONLYOFFICE + Ollama,本地AI模型的高效集成方案

这篇文章将继续探讨如何在 ONLYOFFICE 中连接并高效使用各类 AI 模型。今天的主角是 Ollama——一个专为本地部署和运行 AI 模型的平台。如何使用 Ollama 并与 ONLYOFFICE 编辑器集成&#xff0c;利用其强大的 AI 模型处理文本任务。以下是详细的操作步骤和使用方法。 关于 ONL…

单片机开发为什么不用C++?

最近受到很多初学者的灵魂拷问&#xff0c;单片机需要学C吗&#xff1f; 还别说&#xff0c;问这问题的还挺多的&#xff0c;今天以一篇文章来说下。 很多小白觉得&#xff0c;C语言这老古董&#xff0c;语法简陋得像石器时代的产物&#xff0c;为什么还牢牢霸占着单片机开发的…

2025-02-28 学习记录--C/C++-C语言 scanf 中,%s 不需要加

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; C语言 scanf 中&#xff0c;%s 不需要加 & 格式化符号变量类型是否需要加 &原因%s字符数组不需要数组名本身就是指针&a…

数字样机:从技术革新到产业赋能的演进之路

摘要&#xff1a;数字样机作为产品全生命周期数字化的核心技术&#xff0c;旨在通过虚拟化建模与仿真技术重构传统工业研发范式。 数字样机&#xff08;Digital Prototype&#xff0c;DP&#xff09;技术是一种数字化设计技术&#xff0c;利用数字样机替代原型样机&#xff0c…

Ubuntu20.04安装Isaac sim/ Isaac lab

2025年之后omniverse好像不能直接装Isaac sim了&#xff0c;要跳转到官网链接。 Isaac lab要在Isaac sim安装之后才能安装 Ubuntu20.04安装Isaac sim/ Isaac lab Isaac sim安装Isaac lab安装 Isaac sim安装 找到官网 Isaac sim官方文档 下载下来解压到本地文件夹&#xff0c…

8款智能排班系统,全面深入介绍

本文介绍了以下8款主流的排班系统&#xff1a;1.i人事&#xff1b;2.Moka&#xff1b; 3.When I Work&#xff1b; 4.薪人薪事&#xff1b; 5.泛微e-office&#xff1b; 6.多可软件&#xff1b; 7.钉钉&#xff1b; 8.Homebase等。 排班系统作为一种高效的管理工具&#xff0c;…

DeepSeek 助力 Vue3 开发:打造丝滑的页脚(Footer)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

SpringCloud 微服务框架

单体架构&#xff1a;将业务全部功能集中到一个项目中&#xff0c;打成一个war包存储,部署在一台服务器中&#xff0c;只有一个数据库 优点 &#xff1a;架构简单&#xff0c;部署成本低。适合小型项目 问题&#xff1a;高并发性能问题&#xff0c;开发时代码耦合问题&#x…

goLand导入git项目并打包发布linux

作为项目管理&#xff0c;拥有半吊子开发能力&#xff0c;居然有一天需要修改维护go项目。。。从菜鸟教程学习开始~苦 goland导入git项目 本地启动 导入之后会自动更新相关依赖。 本人导入之后立马修改了依赖位置&#xff0c;且修改为一项目一位置&#xff0c;互不干涉。 在代…

通义灵码插件安装入门教学 - IDEA(安装篇)

在开发过程中&#xff0c;使用合适的工具和插件可以极大地提高我们的工作效率。今天&#xff0c;我们将详细介绍如何在 IntelliJ IDEA 中安装并配置通义灵码插件&#xff0c;这是一款旨在提升开发者效率的实用工具。无论你是新手还是有经验的开发者&#xff0c;本文都将为你提供…

【设计模式精讲】开源实战之剖析Spring框架:Spring中工厂模式的应用

文章目录 第七章 开源实战7.1 剖析Spring框架中用到的经典设计模式7.1.1 Spring中工厂模式的应用7.1.1.1 Spring中的Bean组件7.1.1.2 Spring中的BeanFactory7.1.1.3 Spring中的FactoryBean 个人主页&#xff1a;道友老李 欢迎加入社区&#xff1a;道友老李的学习社区 第七章 开…

[数据结构]用栈实现队列

思路分析 代码实现&#xff1a; typedef int STDataType; typedef struct Stack {int* a;int top;//下标int capacity; }ST; //栈的初始化 void STInit(ST* ps); //栈的插入 void STPush(ST* ps, STDataType x); //栈的删除 void STPop(ST* ps); // int STSize(ST* ps); //判断…

48V电气架构全面科普和解析:下一代智能电动汽车核心驱动

48V电气架构&#xff1a;下一代智能电动汽车核心驱动 随着全球汽车产业迈入电动化、智能化的新时代&#xff0c;传统12V电气系统逐渐暴露出其无法满足现代高功率需求的不足。在此背景下&#xff0c;48V电气架构应运而生&#xff0c;成为现代电动汽车&#xff08;EV&#xff09…

图数据库 | 24、如何进行正确性验证?

图数据库计算和查询结果的正确性&#xff0c;这个重要性当然是不言而喻的&#xff01; 老夫之前也写文章讲过&#xff0c;今天再手书一篇&#xff0c;旨在向大家系统地介绍一下图数据库查询与计算到底如何进行正确性验证&#xff01;&#xff01;&#xff01; 图数据库中的操…