首页 > 其他分享 >刷刷刷 Day 34 | 135. 分发糖果

刷刷刷 Day 34 | 135. 分发糖果

时间:2023-02-19 23:35:33浏览次数:53  
标签:ratings candyCountArr 分发 int len 34 135 糖果 Day

135. 分发糖果

LeetCode题目要求

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

示例

输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
解题思路

从左到右,如果右大于左,那么右边左多一个糖果,但此时能保证的是右大于左的情况
然后在从右刀座,如果右小于左,就再分配糖果,让左边的再+1,同时与原数量作对比,取大的。
本题通过局部最优,推出全局最优。需要两部走

上代码

class Solution {
    public int candy(int[] ratings) {
        int len = ratings.length;
        int[] candyCountArr = new int[len];

        // 总共需要的数量
        int candyTotal = 0;

        // 初始位置第一个至少个 1 个 candy
        candyCountArr[0] = 1;
        for (int i = 1; i < len; i++) {
            // 如果右边的大于左边的,
            if (ratings[i] > ratings[i-1]) {
                // 那么右边的比左边的要多1个
                candyCountArr[i] = candyCountArr[i-1] + 1;
            } else {
                // 其他的一律默认给 1 个 candy
                candyCountArr[i] = 1;
            }
        }

        // 第二次遍历 处理右边小于左边的(左边大于右边), 从后遍历
        for (int i = len - 2; i >= 0; i--) {
            // 如果左大于右
            if (ratings[i] > ratings[i+1]) {
                // 从 candyCountArr[i+1] + 1, candyCountArr[i] 取大的,
                // 即 candyCountArr[i+1] 右侧小,那么左侧应该大于右侧,此时 +1 后就是左侧的值;但这时还要看新的值和原左侧的值,哪个个大,取大的
                candyCountArr[i] = Math.max(candyCountArr[i+1] + 1, candyCountArr[i]);
            }
        }

        for (int i = 0; i < len; i++) {
            candyTotal += candyCountArr[i];
        }

        return candyTotal;
    }
}

附:学习资料链接

标签:ratings,candyCountArr,分发,int,len,34,135,糖果,Day
From: https://www.cnblogs.com/blacksonny/p/17135936.html

相关文章

  • day75-props属性
    props属性在组件中接受外部传来的数据本案例是由school组件中接受从app中传来的数据,进行age的加法实现方法school组件:<template><divclass="demo"><h1>{......
  • day74-ref属性
    ref属性用于给元素或者子组件注册引用信息,是id的替代者实现首先配置school组件<template><divclass="demo"><h2>学校名称:{{name}}</h2><h2>学校地......
  • day73-分析脚手架
    vue脚手架初始化上个星期讲组会了,再看论文总结论文,而且陪对象过了情人节出去玩了几天,中间也在学习,不过没有及时总结初始化vue脚手架是vue提供的标准化开发工具文件结构......
  • vue---day05( )
    上节课回顾#0checkboxv-model只针对于input,做双向数据绑定 -单选:选中或不选中选中就是true,不选中就是false -多选:数组,选了多个,把选中的value值放到数组中......
  • Linux、Rust、C++学习笔记(day1)
    序言从今天开始以Ubuntu22.04为开发环境,学习Linux、Rust和C++的开发。博文作为个人学习记录和分享,欢迎各位与笔者讨论交流!开发环境搭建我的机器是腾讯云的云服务器。腾......
  • 洛谷P2341/USACO03FALL 受欢迎的牛
    题意分析题目链接喜欢是单向的,喜欢有传递性……Emmm这听起来好像……对了,就是连通性问题!我们不妨将奶牛之间的喜欢关系表示为一条条单向边,怎么求明星奶牛的数量呢?这里......
  • CF1734E Rectangular Congruence 题解
    可能更好的阅读体验题目传送门toluogu为什么只有VP才会遇到这种简单E。题目大意给定一个质数\(n\)和长度为\(n\)的序列\(b\),要求构造一个\(n\timesn\)矩......
  • day6 golang-标准库(随时更新)
    time时间库 packagemainimport( "fmt" "time")funcmain(){ t:=time.Now() //time.Timetime.Date(2023,time.February,19,14,38,1,393023500,ti......
  • Day 13 第五章 栈与队列 |239. 滑动窗口最大值
    239. 滑动窗口最大值题目链接:https://leetcode.cn/problems/sliding-window-maximum/看到题目的第一个想法:想到的使用暴力法把每一种情况给算出来,但是显然这样会超时......
  • vue_day05
    目录今日内容详细一、组件其他二、组件间通信之父传子三、组件间通信之子传父四、ref属性五、动态组件1、不使用动态组件2、动态组件component标签3、keep-alive保持组件不......