【LeetCode每日一题】——135.分发糖果
创始人
2024-05-31 06:30:31

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【解题思路】
  • 七【题目提示】
  • 八【时间频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

  • 贪心算法

二【题目难度】

  • 困难

三【题目编号】

  • 135.分发糖果

四【题目描述】

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

五【题目示例】

  • 示例 1:

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

    • 输入:ratings = [1,2,2]
    • 输出:4
    • 解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。

六【解题思路】

  • 这道题有难度,不太好想,主要利用贪心的思路遍历两次数组,分别从左到右遍历和从右到左遍历,也就是满足两个规则:
    • 左规则:从左到右遍历,因为题目要求每个人最少一个糖果,所以第一个人默认一个糖果,然后从第二个人开始遍历,如果第iii个人的评分大于第i−1i-1i−1个人的评分,根据题目要求,第iii个人的糖果数要比第i−1i-1i−1个人的糖果数多一个;如果第iii个人的评分小于等于第i−1i-1i−1个人的评分,那么第i−1i-1i−1个人的糖果数就是默认的一颗糖果。当然,需要使用一个数组来存储每个人的糖果数
    • 右规则:从右到左遍历,因为题目要求每个人最少一个糖果,所以最后个人默认一个糖果,然后从倒数第二个人开始遍历,如果第iii个人的评分大于第i+1i+1i+1个人的评分,根据题目要求,第iii个人的糖果数要比第i+1i+1i+1个人的糖果数多一个;如果第iii个人的评分小于等于第i+1i+1i+1个人的评分,那么第i−1i-1i−1个人的糖果数就是默认的一颗糖果。此时需要使用另一个数组来存储每个人的糖果数
  • 最后计算总的糖果数,将上面的得到的数组进行遍历,对于第iii个人,既要满足左规则也要满足右规则,所以取两者中的最大值
  • 最后返回结果即可

七【题目提示】

  • n==ratings.lengthn == ratings.lengthn==ratings.length
  • 1<=n<=2∗1041 <= n <= 2 * 10^41<=n<=2∗104
  • 0<=ratings[i]<=2∗1040 <= ratings[i] <= 2 * 10^40<=ratings[i]<=2∗104

八【时间频度】

  • 时间复杂度:O(n)O(n)O(n),其中nnn为传入数组的长度
  • 空间复杂度:O(n)O(n)O(n),其中nnn为传入数组的长度

九【代码实现】

  1. Java语言版
class Solution {public int candy(int[] ratings) {int len = ratings.length;int[] left = new int[len];int[] right = new int[len];left[0] = 1;for(int i = 1;i < len;i++){left[i] = ratings[i] > ratings[i - 1] ? left[i - 1] + 1 : 1;}right[len - 1] = 1;for(int i = len - 2;i>=0;i--){right[i] = ratings[i] > ratings[i + 1] ? right[i + 1] + 1 : 1;}int res = 0;for(int i = 0;ires += Math.max(left[i],right[i]);}return res;}
}
  1. C语言版
int candy(int* ratings, int ratingsSize)
{int* left = (int*)malloc(sizeof(int) * ratingsSize);int* right = (int*)malloc(sizeof(int) * ratingsSize);left[0] = 1;for(int i = 1;ileft[i] = ratings[i] > ratings[i - 1] ? left[i - 1] + 1 : 1;}right[ratingsSize - 1] = 1;for(int i = ratingsSize - 2;i>=0;i--){right[i] = ratings[i] > ratings[i + 1] ? right[i + 1] + 1 : 1;}int res = 0;for(int i = 0;ires += fmax(left[i],right[i]);}return res;
}
  1. Python版
class Solution:def candy(self, ratings: List[int]) -> int:N = len(ratings)left = [0] * Nright = [0] * Nleft[0] = 1for i in range(1,N):left[i] = left[i - 1] + 1 if ratings[i] > ratings[i - 1] else 1right[N - 1] = 1for i in range(N - 2,-1,-1):right[i] = right[i + 1] + 1 if ratings[i] > ratings[i + 1] else 1res = 0for i in range(0,N):res += max(left[i],right[i])return res

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  3. Python语言版
    在这里插入图片描述

相关内容

热门资讯

投资者提问:你好董秘:请问公司... 投资者提问:你好董秘:请问公司财报更正对公司年度财务数据影响大吗?董秘回答(神农种业SZ300189...
创造适宜货币金融环境 增强高质... 2025年适度宽松的货币政策发力显效,为经济稳定增长和高质量发展创造了适宜的货币金融环境。2025年...
陇南市与南充市签署战略合作协议 陇南市与南充市签署战略合作协议 每日甘肃网1月16日讯 据陇南日报报道(记者杨德)1月14日,我市与...
新增贷款超16万亿元!金融“活... 金融是国民经济的血脉。1月15日中国人民银行发布的数据显示,2025年全年新增贷款16.27万亿元。...
【财经早报】2026-01-1... (来源:海南港澳资讯产业股份有限公司)●央行:为更好发挥结构性货币政策工具的激励作用,引导金融机构加...