>0️⃣python数据结构与算法学习路线
>学习内容:
>- 基本算法:枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等...
>- 数据结构:字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组、队列、栈、树、图、堆等...
题目:
一群孩子站成一排,每一个孩子有自己的评分。现在需要给这些孩子发糖果,规则是如果一个孩子的评分比自己身旁的一个孩子要高,那么这个孩子就必须得到比身旁孩子更多的糖果;所有孩子至少要有一个糖果。求解最少需要多少个糖果。
输入输出:
输入是一个数组,表示孩子的评分。输出是最少糖果的数量。
Input: [1,0,2]
Output: 5
解题思路:
只需遍历两次即可:把所有孩子的糖果数初始化为 1;
先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加 1
;再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加 1
。
算法实现:
class Solution(object):
def candy(self, ratings):
l = len(ratings)
tang = [1]*l#如何定义长度为len(ratings)的列表?
for i in range(0,l-1):
if ratings[i] < ratings[i+1]:
tang[i+1] = tang[i]+1
'''
elif ratings[i] == ratings[i+1]:
tang[i+1] = tang[i]
'''
for j in range(l-1,0,-1):
if ratings[j] < ratings[j-1]:
tang[j-1] = max(tang[j]+1,tang[j-1])
return sum(tang)
出现问题:
1.range(start,end,步长)函数使用
range(0,5)输出是0-4对应的数而不是0-5
反向遍历的时候range(l,-1,-1)是从后往前取
想要到第一个数才结束要到-1而不是0,算是从l开始而不能写range(0,l,-1)
在进行循环的时候要注意循环中应用的是i-1还是i,注意范围不要超
2.判断等于是==而不是=
3.求列表的和可以用sum(tang)
用for z in tang:
res +=z是错的(没明白为什么)
4.break和continue