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

文章目录

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

一【题目类别】

  • 贪心算法

二【题目难度】

  • 困难

三【题目编号】

  • 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语言版
    在这里插入图片描述

相关内容

热门资讯

祝家沟村:果红苗翠日子甜 转自:辽宁日报 果树枝头硕果累累、广袤稻田郁郁葱葱……日前,记者再访葫芦岛市绥中县明水满族乡祝家沟村...
涉嫌严重违纪违法,王春秋被查! 转自:上观新闻据中央纪委国家监委驻自然资源部纪检监察组、浙江省纪委监委消息:国家自然资源督察南京局原...
昆明智能化信息采集车上岗   本报讯 记者孙潇报道 在智能化飞速发展的今天,网格化管理也不断迎来智慧化变革。7月4日,记者从昆...
《翠湖》再掀“滇浪潮” 多元云...   当《去有风的地方》将大理古城包装成都市人的精神疗愈所,当《一点就到家》在普洱茶山上演绎电商创业神...
今年前5个月我国服务贸易同比增...   商务部最新数据显示,今年前5个月,我国服务进出口总额32543.6亿元人民币,同比增长7.7%。...
喜娜AI速递:昨夜今晨财经热点... 金融市场犹如变幻莫测的海洋,时刻涌动着投资与经济政策的波澜,深刻影响着全球经济的走向。在此,喜娜AI...
南亚东南亚数字信息大通道加速成...   跨境电商、游戏出海、跨境直播……昆明国际通信业务出入口局的建设,关系到云南乃至南亚东南亚数亿用户...
广西 田园牧歌 产融共富 转自:贵州日报广西壮族自治区柳州市三江自治县春茶喜获丰收。 龚...
手机挖矿哪个最赚钱(正规挖矿赚... 昨天介绍了几款挖掘用的应用,反响很好。今天,我继续介绍其他采矿应用。不要小看这些免费的挖掘软件,它可...
鱼香肉丝的家常做法-做香的厂子... 大家好,我是第一美食的阿飞,关注阿飞,有更多的家常美食供大家参考。今天,我想和大家分享一个经典名菜“...