问题描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。
问题分析
第一次思路:
设鱼干数step初始为0,创建对应的鱼干数组,遍历等级数组,当下一只猫等级比上一只猫等级大时,step加一并赋予下一只猫;当下一只猫等级比上一只猫等级小时,step减一并赋予下一只猫;最后能够得到符合等级趋势的鱼干数组,再全体加长鱼干最小值和1的差,使数组中所有数都大于等于1,返回数组总和。
错误点:
未考虑到当一只猫的等级比相邻猫都小时,这只猫的鱼干可以尽可能小且能满足题意;此外需要考虑的还有:在数组两端存在差异;当一一只猫的等级比相邻猫都大时,该猫的鱼干数取决于相邻猫中的较大值。
第二次思路:
通过逐一对猫的鱼干进行赋值:创建对应的鱼干数组并全部置0,当鱼干数组还有未赋值时(等于0),以同一指针i遍历等级数组和鱼干数组,当该猫的鱼干为0时,取另一指针j找到在i之和有多少猫与该i猫等级一致,并将他们视为一个整体;j最后的值是之后第一个不同等级的猫或数组长度n。
- 当i==0且i猫等级比j猫小时,赋予[i:j]全部猫鱼干数量为1;
- 当i==0且i猫等级比j猫大且j猫鱼干已赋值时,赋予[i:j]全部猫鱼干数量为j猫鱼干数量加1;
- 当j==n且i猫等级比i-1猫小时,赋予[i:j]全部猫鱼干数量为1;
- 当j==n且i猫等级比i-1猫大且i-1猫鱼干已赋值时,赋予[i:j]猫鱼干数量为i-1猫鱼干数量加1;
- 当i!=0且j!=n且i-1猫等级比i猫等级大且j猫等级比i猫大时,赋予[i:j]全部猫鱼干数量为1;
- 当i!=0且j!=n且i-1猫等级比i猫等级小且j猫等级比i猫大且i-1猫鱼干已赋值时,赋予[i:j]全部猫鱼干数量为i-1猫鱼干数量加1;
- 当i!=0且j!=n且i-1猫等级比i猫等级大且j猫等级比i猫小且j猫鱼干已赋值时,赋予[i:j]全部猫鱼干数量为j猫鱼干数量加1;
- 当i!=0且j!=n且i-1猫等级比i猫等级小且j猫等级比i猫小且i-1、j猫鱼干已赋值时,赋予[i:j]全部猫鱼干数量为i-1、j猫鱼干数量较大值;
- 若以上情况都不符合,暂时跳过。 最后直至鱼干数组全部赋值,再返回数组总和。
错误点:
同等级且相邻的猫所得鱼干是要相等的,但事实是同等级且相邻的猫之间鱼干数之差可以随意赋值。
第三次思路:
在第二次思路的基础上进行修改,去掉遍历寻找相邻同等级的操作,把相邻同等级的情况加入到原来的情况里,例如左右都相等时可以加入左右都大于的情况。
最终代码:
def solution(n, cats_levels):
c=cats_levels
# Please write your code here
fish=[0 for i in range(n)]
while(0 in fish):
i=0
while(i<n):
if fish[i]==0:
if i==0 and c[i+1]>=c[i]:
fish[i]=1
elif i==0 and c[i+1]<c[i] and fish[i+1]!=0:
fish[i]=fish[i+1]+1
elif i==n-1 and c[i-1]>=c[i]:
fish[i]=1
elif i==n-1 and c[i-1]<c[i] and fish[i-1]!=0:
fish[i]=fish[i-1]+1
elif c[i-1]>=c[i] and c[i+1]>=c[i]:
fish[i]=1
elif c[i-1]<c[i] and c[i+1]>=c[i] and fish[i-1]!=0:
fish[i]=fish[i-1]+1
elif c[i-1]>=c[i] and c[i+1]<c[i] and fish[i+1]!=0:
fish[i]=fish[i+1]+1
elif c[i-1]<c[i] and c[i+1]<c[i] and fish[i-1]!=0 and fish[i+1]!=0:
fish[i]=max(fish[i-1], fish[i+1])+1
else:
pass
i=i+1
else:
i=i+1
return sum(fish)
if __name__ == "__main__":
# You can add more test cases here
cats_levels1 = [1, 2, 2]
cats_levels2 = [6, 5, 4, 3, 2, 16]
cats_levels3 = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]
print(solution(3, cats_levels1) == 4)
print(solution(6, cats_levels2) == 17)
print(solution(20, cats_levels3) == 35)