昨天晚上去旺旺那儿称体重
本来以为这段时间吃的比较少
会瘦些
没想到体重还是没变化
天呐
难道我的均值就是这么大嘛
为什么
我这一米六几身高的人儿
要承受这么大的体重
135-分发糖果
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
你需要按照以下要求,帮助老师给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻的孩子中,评分高的孩子必须获得更多的糖果。
那么这样下来,老师至少需要准备多少颗糖果呢?
示例 1:
输入: [1,0,2]
输出: 5
解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。
示例 2:
输入: [1,2,2]
输出: 4
解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。
第三个孩子只得到 1 颗糖果,这已满足上述两个条件。
思路:
这一题其实和第123题-买卖股票的最佳时机III很像,都是用正序和逆序两次遍历来求解最佳答案,之前很少接触此种解法,觉得甚是奇妙。各位读者如果有对第123题-买卖股票的最佳时机III不是很熟悉的朋友,可以先看看我写的那篇文章。
https://blog.csdn.net/weixin_36431280/article/details/99971134
此题的解法步骤是:
1. 首先给每个孩子分配一颗糖果,用candy_list数组来保存
2. 正向调整,如果当前孩子比之前孩子的分数高,
那么令当前孩子的糖果数比之前孩子糖果数大1 res[i]=res[i-1]+1;
3. 反向调整,如果当前孩子比之前孩子的分数高,
那么比较当前孩子的糖果数和之前孩子的糖果数+1,
取更大的为当前孩子糖果数res[i]=max(res[i],res[i+1]+1);
第二次遍历的时候会更新最终的值,真的很奇妙。后面我应该会专门写篇文章来介绍这种方法,大家敬请期待哈哈哈哈哈哈。
代码如下:
class Solution(object):
def candy(self, ratings):
"""
:type ratings: List[int]
:rtype: int
"""
# 首先给每个孩子分配一颗糖果
candy_list = [1]*len(ratings)
candy_list.insert(0, 0)
candy_list.append(0)
# 首尾加上0,方便遍历首尾元素
ratings.insert(0, 0)
ratings.append(0)
# 正向调整,如果当前孩子比之前孩子的分数高,
# 那么令当前孩子的糖果数比之前孩子糖果数大1 res[i]=res[i-1]+1;
for start in range(1, len(ratings)-1):
if ratings[start] > ratings[start-1]:
candy_list[start] = candy_list[start-1]+1
# 反向调整,如果当前孩子比之前孩子的分数高,
# 那么比较当前孩子的糖果数和之前孩子的糖果数+1,
# 取更大的为当前孩子糖果数res[i]=max(res[i],res[i+1]+1);
for end in range(len(ratings)-2, 0, -1):
if ratings[end] > ratings[end+1]:
candy_list[end] = max(candy_list[end], candy_list[end+1]+1)
return sum(candy_list)
if __name__ == "__main__":
ratings = [1, 2, 2]
candy_num = Solution().candy(ratings)
print(candy_num)
执行效率还算不错,达到了60%
大家要是有更好的方法,也希望积极留言啊!!!