当前位置: 首页 > article >正文

算法-遍历分发糖果

hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧!

在这里插入图片描述

function candy(ratings) {
    // 获取孩子的数量
    const n = ratings.length;
    // 初始化一个长度为 n 的数组 candies,用于存储每个孩子分配到的糖果数,初始每个孩子至少有 1 颗糖果
    const candies = new Array(n).fill(1);

    // 从左到右遍历孩子的评分数组
    for (let i = 1; i < n; i++) {
        // 如果当前孩子的评分比前一个孩子高
        if (ratings[i] > ratings[i - 1]) {
            // 那么当前孩子的糖果数要比前一个孩子多 1 颗
            candies[i] = candies[i - 1] + 1;
        }
    }

    // 从右到左遍历孩子的评分数组
    for (let i = n - 2; i >= 0; i--) {
        // 如果当前孩子的评分比后一个孩子高
        if (ratings[i] > ratings[i + 1]) {
            // 取当前孩子已分配的糖果数和后一个孩子糖果数加 1 中的较大值
            // 这样能保证既满足从左到右的规则,也满足从右到左的规则
            candies[i] = Math.max(candies[i], candies[i + 1] + 1);
        }
    }

    // 计算所有孩子分配到的糖果总数
    let totalCandies = 0;
    for (let i = 0; i < n; i++) {
        totalCandies += candies[i];
    }

    return totalCandies;
}

// 示例测试
const ratings = [1, 0, 2];
console.log(candy(ratings)); 

代码解释

整体思路
本题要求给孩子们分糖果,需要满足每个孩子至少有 1 颗糖果,并且相邻孩子中评分高的孩子获得更多糖果。为了满足这些条件,我们可以采用两次遍历的方法:
第一次从左到右遍历,保证每个孩子如果比其左边孩子评分高,那么他的糖果数比左边孩子多。
第二次从右到左遍历,保证每个孩子如果比其右边孩子评分高,那么他的糖果数比右边孩子多。同时在这个过程中要取满足两次遍历规则的最大值。
最后将每个孩子的糖果数累加起来,得到最少需要准备的糖果总数。

代码步骤分析

初始化:
n:获取孩子的数量,方便后续操作。
candies:创建一个长度为 n 的数组,初始每个元素都为 1,表示每个孩子至少分配到 1 颗糖果。

从左到右遍历:
从第二个孩子(索引为 1)开始遍历到最后一个孩子。
若当前孩子评分比前一个孩子高,则当前孩子的糖果数为前一个孩子糖果数加 1。

从右到左遍历:
从倒数第二个孩子(索引为 n - 2)开始遍历到第一个孩子。
若当前孩子评分比后一个孩子高,则当前孩子的糖果数取当前值和后一个孩子糖果数加 1 中的较大值。这样可以同时满足从左到右和从右到左的规则。

计算总数:
遍历 candies 数组,将每个孩子的糖果数累加起来,得到最少需要准备的糖果总数。


http://www.kler.cn/a/521875.html

相关文章:

  • XSS 漏洞全面解析:原理、危害与防范
  • Highcharts 柱形图:深入解析与最佳实践
  • LeetCode100之子集(78)--Java
  • 群晖docker获取私有化镜像http: server gave HTTP response to HTTPS client].
  • fpga系列 HDL:XILINX Vivado Vitis 高层次综合(HLS) 实现 EBAZ板LED控制(上)
  • c高级复习
  • 解码大数据的四个V:体积、速度、种类与真实性
  • SpringMVC的参数处理
  • c语言中mysql_query的概念和使用案例
  • Niagara学习笔记
  • 解决Oracle SQL语句性能问题(10.5)——常用Hint及语法(7)(其他Hint)
  • 【linux】Linux 常见目录特性、权限和功能
  • LockSupport概述、阻塞方法park、唤醒方法unpark(thread)、解决的痛点、带来的面试题
  • Firewalld 防火墙
  • Python的那些事第三篇:Python编程的“调味料”与“交流术”运算符与输入输出
  • 读书笔记--分布式服务架构对比及优势
  • 基于SpringBoot的志愿者招募管理系统
  • 目标跟踪之sort算法(3)
  • [免费]基于Python的Django博客系统【论文+源码+SQL脚本】
  • Python3 【函数】项目实战:5 个新颖的学习案例
  • 从0到1:.NET Core微服务的Docker容器奇幻冒险
  • springboot 动态线程池
  • 省级金融发展水平数据(2000-2022年)-社科数据
  • git困扰的问题
  • C++标准线程库实现优雅退出的方式
  • three.js+WebGL踩坑经验合集(5.2):THREE.Mesh和THREE.Line2在镜像处理上的区别