首页 > 其他分享 >Leetcode 每日一题 135.分发糖果

Leetcode 每日一题 135.分发糖果

时间:2024-11-08 20:44:52浏览次数:7  
标签:分发 arr 遍历 数组 ratings 孩子 135 糖果 Leetcode

问题描述

给定一个整数数组 ratings,表示一排孩子的评分。我们需要按照以下规则给孩子们分发糖果:

  1. 每个孩子至少得到1个糖果。
  2. 相邻两个孩子中,评分更高的孩子会得到更多的糖果。

我们的目标是计算出按照这些规则分发糖果所需的最少糖果数。

输入输出格式

  • 输入:一个整数数组 ratings
  • 输出:一个整数,表示最少需要准备的糖果数。

示例

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

  2. 输入:ratings = [1,2,2] 输出:4 解释:给第一个、第二个、第三个孩子分别分发1、2、1颗糖果。

难点分析

这个问题的难点在于如何高效地分配糖果,同时满足每个孩子至少得到1个糖果,以及评分高的孩子得到更多糖果的条件。

算法选择

我们选择使用贪心算法来解决这个问题。贪心算法在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是最好或最优的算法。

算法逻辑

  1. 初始化:为每个孩子分配1个糖果,用数组 arr 表示,长度与 ratings 相同,初始值都为1。

  2. 从左到右遍历:遍历 ratings 数组,如果当前孩子的评分低于下一个孩子的评分(即 ratings[i] < ratings[i+1]),则下一个孩子的糖果数至少为当前孩子的糖果数加1(即 arr[i+1] = arr[i] + 1)。

  3. 从右到左遍历:反向遍历 ratings 数组,如果当前孩子的评分高于前一个孩子的评分,并且前一个孩子的糖果数不小于当前孩子的糖果数(即 ratings[i] > ratings[i-1] && arr[i-1] <= arr[i]),则前一个孩子的糖果数更新为当前孩子的糖果数加1(即 arr[i-1] = arr[i] + 1)。

  4. 计算总糖果数:遍历 arr 数组,将所有孩子的糖果数相加,得到总糖果数。

代码实现

以下是使用Java语言实现的代码:


java

class Solution {
    public int candy(int[] ratings) {
        int[] arr = new int[ratings.length];
        for(int i=0;i<arr.length;i++){
            arr[i]=1;
        }
        for(int i=0;i<arr.length-1;i++){
            if(ratings[i]<ratings[i+1]){
                arr[i+1]=arr[i]+1;
            }
        }
        for(int i =arr.length-1;i>0;i--){
            if(ratings[i]<ratings[i-1]&&arr[i-1]<=arr[i]){
                arr[i-1]=arr[i]+1;
            }
        }
        int sum=0;
        for(int i=0;i<arr.length;i++){
            sum+=arr[i];
        }
        return sum;
    }
}

复杂度分析

  • 时间复杂度:O(n),其中n是 ratings 数组的长度。我们对数组进行了两次遍历。
  • 空间复杂度:O(n),用于存储每个孩子分配的糖果数。

标签:分发,arr,遍历,数组,ratings,孩子,135,糖果,Leetcode
From: https://blog.csdn.net/weixin_73687229/article/details/143634672

相关文章

  • Leetcode 474 dp数组讲解和滚动数组优化
    474.一和零​ ​dp[i][w1][w2]:DP数组的集合:考虑前i个物品包括第i个,满足背包重量不超过[w1][w2]的所有集合把输入数组中的每个string当作是一个物品,其重量分别为string中0和1的个数属性:价值每个物品的价值是1因为我们求最大子集的个数,一个字符串对子集个数贡献的......
  • Intern大模型训练营(二):leetcode习题+Vscode连接InternStudio debug
    1.Leetcode383:思路:使用两个数组存储两个字符串中出现的字符,然后一一比较数量。classSolution:defcanConstruct(self,ransomNote:str,magazine:str)->bool:cnta=[0]*26cntb=[0]*26forcinransomNote:cnta[or......
  • Leetcode 3235. 判断矩形的两个角落是否可达
    1classSolution{2public:3boolcanReachCorner(intxCorner,intyCorner,vector<vector<int>>&circles){4vector<bool>visited(circles.size(),false);56function<bool(int)>dfs=[&](inti)......
  • 代码随想录算法训练营第二十一天| leetcode669. 修剪二叉搜索树、leetcode108.将有序
    1leetcode669.修剪二叉搜索树题目链接:669.修剪二叉搜索树-力扣(LeetCode)文章链接:代码随想录视频链接:你修剪的方式不对,我来给你纠正一下!|LeetCode:669.修剪二叉搜索树_哔哩哔哩_bilibili思路:目前想的是分三种情况,第一种情况就是这个数删除左边全部,第二种删除右边的全部,第......
  • 代码随想录算法训练营第二十天|leetcode235. 二叉搜索树的最近公共祖先、leetcode701.
    1leetcode235.二叉搜索树的最近公共祖先题目链接:235.二叉搜索树的最近公共祖先-力扣(LeetCode)文章链接:代码随想录视频链接:二叉搜索树找祖先就有点不一样了!|235.二叉搜索树的最近公共祖先_哔哩哔哩_bilibili思路:用之前一样的方法,哈哈哈哈哈,好处就是做出来了,但是我觉得需......
  • LeetCode 2544[交替数字和]
    题目链接LeetCode2544[交替数字和]详情实例提示题解思路依次求出各位数字,然后进行计算循环找出各位数字:(循环体如下)  将数字对10取余得到对应位数的数字,加入到容器numVec  数字除以10,得到新的数字,此数字是不包含已获取数字的位数循环退出的条件:数字等于0循环......
  • LeetCode 2535[数组元素和与数字和的绝对差值]
    题目链接LeetCode2535[数组元素和与数字和的绝对差值]详情实例提示题解思路遍历容器,依次求出数字和与元素和,然后求差值:通过getSun函数,求取元素的数字和 getSun函数的实现:  将其对10取余操作,获取的余数即为当前位的数字  然后再除以10,继续对其进行10的取......
  • LeetCode HOT 100 记录
    目录230.二叉搜索树中第K小的元素-力扣(LeetCode)199.二叉树的右视图-力扣(LeetCode)230.二叉搜索树中第K小的元素-力扣(LeetCode)相当于把二叉搜索树从小到大排序,而二叉搜索树有一个特点,就是顺序左子树<根节点<右子树,因此可以考虑使用中序遍历/***Definitionfo......
  • 代码随想录算法训练营第九天|LeetCode151.翻转字符串里的单词、卡码网:55.右旋转字符串
    前言打卡代码随想录算法训练营第49期第九天︿( ̄︶ ̄)︿首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。今日题目LeetCode151翻转字......
  • LeetCode 1137[第N个泰波那契数]
    题目链接LeetCode1137[第N个泰波那契数]详情实例实例1实例2提示题解思路一[递归]当n为0,1,2时,直接返回对应的值当n大于2时,开始用f(n+3)=f(n)+f(n+1)+f(n+2)来递归求值代码一[此代码在力扣会超出时间限制]classSolution{public:inttrib......