题目描述:
n
个孩子站成一排。给你一个整数数组 ratings
表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到
1
个糖果。 - 相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例 1:
输入:ratings = [1,0,2] 输出:5 解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
示例 2:
输入:ratings = [1,2,2] 输出:4 解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。 第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。
提示:
n == ratings.length
1 <= n <= 2 * 104
0 <= ratings[i] <= 2 * 104
我的作答:
分为两种需要更新糖果数量的情况:左孩子分数>右孩子, 和右>左,相等的时候不用更新;
(1)我是按照先判断孩子是否比左边的分数高,再判断是否比右边的分数高,可以顺序调换一下,整体思路不变;因为需要糖果最小,所以只需要更新时+1就行;
步骤1:先判断是否比左边分数高,即糖果数是否要比左边的+1
很简单,就是该指针的元素值+1;
步骤2:判断是否比右边分数高;
因为我们步骤1中已经给元素加过1了,但是我们要判断的是没加1前的元素是否比它右边的元素分数高,所以我们可以给右边的元素+1再进行比较,也可以左边的元素-1比较完再+1;
同时,我们得倒序遍历数组;
class Solution(object):
def candy(self, ratings):
"""
:type ratings: List[int]
:rtype: int
"""
candy = [1]*len(ratings)
result = 0
for i in range(1, len(ratings)): #右>左
if ratings[i]>ratings[i-1]:
candy[i] = candy[i-1]+1
for i in range(len(ratings)-2, -1, -1): #左>右
if ratings[i]>ratings[i+1]:
candy[i] = max(candy[i+1]+1, candy[i]) #判断是否要更新
for i in range(len(ratings)):
result += candy[i]
return result
(2)如果先判断右边,再判断左边也是一样的!
class Solution(object):
def candy(self, ratings):
"""
:type ratings: List[int]
:rtype: int
"""
candy = [1]*len(ratings)
result = 0
for i in range(len(ratings)-2, -1, -1): #左>右
if ratings[i]>ratings[i+1]:
candy[i] = candy[i+1]+1
for i in range(1, len(ratings)): #右>左
if ratings[i]>ratings[i-1]:
candy[i] = max(candy[i-1]+1, candy[i])
for i in range(len(ratings)):
result += candy[i]
return result
诶诶诶??竟然变快了,我估计是因为正序遍历快一些,正序遍历+max判断时间<倒序遍历+max判断时间-v-