您的位置:首页 > 理论基础 > 计算机网络

https://leetcode.com/problems/candy/

2015-05-23 10:56 381 查看
https://leetcode.com/problems/candy/

这道题的想法是

1.左右数字都大于等于它的 算作是凹型的 包括连续相同的几个数组中间的那几个 

    其中最左最右也可以这样算 不过因为只有一端有数 按一端算就行 

    将这些凹点赋值为1 其他为0

2. 从这样的凹点开始 到顶点 (大于等于两端且为0的点)都从凹点向上(左右)加一

3.到顶点时 要取max(左右)

class Solution:
# @param {integer[]} ratings
# @return {integer}
def candy(self, ratings):
if len(ratings)==1:
return 1
if len(ratings)==2:
if ratings[0]==ratings[1]:
return 2
else:
return 3
sol=[0]*len(ratings)
#找凹点
for i in range(1,len(ratings)-1):
if ratings[i]<=ratings[i-1] and ratings[i]<=ratings[i+1]:
sol[i]=1
#确定左右端是否凹
if ratings[0]<=ratings[1]:
sol[0]=1
if ratings[-1]<=ratings[-2]:
sol[-1]=1
#从左至右把上升的坡赋值
for i in range(1,len(ratings)-1):
if ratings[i]>ratings[i-1] and ratings[i]<ratings[i+1]:
sol[i]=sol[i-1]+1
#从右至左把上升的坡赋值
for i in range(1,len(ratings)-1)[::-1]:
if ratings[i]<ratings[i-1] and ratings[i]>ratings[i+1]:
sol[i]=sol[i+1]+1
#如果左右不是凹点 那么端点比它旁边的点大 讲旁边的点加一
if sol[0]==0:
sol[0]=sol[1]+1
if sol[-1]==0:
sol[-1]=sol[-2]+1
#有可能会有两个连续顶点 例如12332 33都是顶点
#先将左顶点赋值 再将右顶点赋值
for i in range(1,len(ratings)-1):
if sol[i-1]!=0 and sol[i]==0 and sol[i+1]!=0:
sol[i]=max(sol[i-1],sol[i+1])+1
for i in range(1,len(ratings)-2):
if sol[i-1]!=0 and sol[i]==0 and sol[i+1]==0:
sol[i]=sol[i-1]+1
sol[i+1]=sol[i+2]+1
#算总和
sum=0
for i in sol:
sum=sum+i
return sum
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: