众所周知,牛妹非常喜欢吃蛋糕。
第一天牛妹吃掉蛋糕总数三分之一(向下取整)多一个,第二天又将剩下的蛋糕吃掉三分之一(向下取整)多一个,以后每天吃掉前一天剩下的三分之一(向下取整)多一个,到第n天准备吃的时候只剩下一个蛋糕。
牛妹想知道第一天开始吃的时候蛋糕一共有多少呢?
有可能出现多解,返回任意一种可能的结果即可。
2
3
4
10
0
class Solution: def cakeNumber(self , n ): # write code here if not n: return 0 x=1 for i in range(n-1): x=int((x+1)*3/2) return x迭代法
class Solution: def cakeNumber(self , n ): dp = [0 for _ in range(n)] dp[-1] = 1 for i in range(n-2,-1,-1): dp[i] = int((dp[i+1]+1)*3/2) return dp[0]第二种方法,数学倒推解法:
class Solution: def cakeNumber(self , n ): res = 1 for _ in range(n-1): res += 1 res *= 3 res //= 2 return res运行效率都差不多,就这样吧。
class Solution: def cakeNumber(self , n ): # n =0 时直接返回 if n == 0: return None dp = [0] * n dp[0] = 1 for i in range(1,len(dp)): #获取前一天蛋糕数量的取值范围 max = int(1.5*(dp[i-1] + 2)) min = int(1.5*(dp[i-1] + 1)) #遍历范围,然后找出正确的数量 for j in range(min,max): if j - j // 3 - 1 == dp[i-1]: dp[i] = j return dp[n-1]
def cakenumber(n): if n == 1: return 1 res = (cakenumber(n - 1) + 1) * 3 // 2 return res
python支持这种形式的递归吗?我在pycharm跑没问题,牛客这里提交不了。
class Solution: m = 1 def cakeNumber(self , n): n -= 1 self.m = int(3*(self.m+1)/2) if n == 1: return int(self.m) return self.cakeNumber(n)