题目描述
众所周知,牛妹非常喜欢吃蛋糕。
第一天牛妹吃掉蛋糕总数三分之一(向下取整)多一个,第二天又将剩下的蛋糕吃掉三分之一(向下取整)多一个,以后每天吃掉前一天剩下的三分之一(向下取整)多一个,到第n天准备吃的时候只剩下一个蛋糕。
牛妹想知道第一天开始吃的时候蛋糕一共有多少呢?
主要信息:每天吃蛋糕总数三分之一(向下取整)多一个;第n天只剩1个
方法一 递归
解题思路
设前后两天的蛋糕数为和
,根据题意有
,那么
,已经知道第
天的蛋糕数为
,所以可以通过递归的方法求得第一天的蛋糕数。
代码示例
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型 只剩下一只蛋糕的时候是在第n天发生的.
* @return int整型
*/
int cakeNumber(int n) {
// 边界条件
if(n == 1)
return 1;
if(n == 2)
return 3;
// 根据推理所得公式进行迭代
return 3 * (cakeNumber(n - 1) + 1) / 2;
}
}; 复杂度分析
- 时间复杂度:需要从第
天递归到第
天,间复杂度为
- 空间复杂度:需要从第
天递归到第
天,递归栈的深度为
,空间复杂度为
方法二 迭代
解题思路
与方法一的思路类似,,为了减少空间复杂度,使用迭代的方法求解。
代码示例
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型 只剩下一只蛋糕的时候是在第n天发生的.
* @return int整型
*/
int cakeNumber(int n) {
int res = 1;
for(int i = n - 2; i >= 0; i--)
// 根据公式更新res
res = 3 * (res + 1) / 2;
return res;
}
}; 复杂度分析
- 时间复杂度:需要从第
天模拟到第
天,间复杂度为
- 空间复杂度:使用了常数个变量,空间复杂度为



京公网安备 11010502036488号