LeetCode 题解工作台
吃掉 N 个橘子的最少天数
厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子。 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子。 如果剩余橘子数 n 能被 3 整除,那么你可以吃掉 2*(n/3) 个橘子。 每天你只能从以上 3 种方案中选择一种方案。 请你返回吃掉所有 n …
2
题型
5
代码语言
3
相关题
当前训练重点
困难 · 状态·转移·动态规划
答案摘要
根据题目描述,对于每个 ,我们可以选择三种方式之一: 1. 将 减少 ;
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路
题目描述
厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子:
- 吃掉一个橘子。
- 如果剩余橘子数
n能被 2 整除,那么你可以吃掉n/2个橘子。 - 如果剩余橘子数
n能被 3 整除,那么你可以吃掉2*(n/3)个橘子。
每天你只能从以上 3 种方案中选择一种方案。
请你返回吃掉所有 n 个橘子的最少天数。
示例 1:
输入:n = 10 输出:4 解释:你总共有 10 个橘子。 第 1 天:吃 1 个橘子,剩余橘子数 10 - 1 = 9。 第 2 天:吃 6 个橘子,剩余橘子数 9 - 2*(9/3) = 9 - 6 = 3。(9 可以被 3 整除) 第 3 天:吃 2 个橘子,剩余橘子数 3 - 2*(3/3) = 3 - 2 = 1。 第 4 天:吃掉最后 1 个橘子,剩余橘子数 1 - 1 = 0。 你需要至少 4 天吃掉 10 个橘子。
示例 2:
输入:n = 6 输出:3 解释:你总共有 6 个橘子。 第 1 天:吃 3 个橘子,剩余橘子数 6 - 6/2 = 6 - 3 = 3。(6 可以被 2 整除) 第 2 天:吃 2 个橘子,剩余橘子数 3 - 2*(3/3) = 3 - 2 = 1。(3 可以被 3 整除) 第 3 天:吃掉剩余 1 个橘子,剩余橘子数 1 - 1 = 0。 你至少需要 3 天吃掉 6 个橘子。
示例 3:
输入:n = 1 输出:1
示例 4:
输入:n = 56 输出:6
提示:
1 <= n <= 2*10^9
解题思路
方法一:记忆化搜索
根据题目描述,对于每个 ,我们可以选择三种方式之一:
- 将 减少 ;
- 如果 能被 整除,将 的值除以 ;
- 如果 能被 整除,将 的值除以 。
因此,问题等价于求解通过上述三种方式,将 减少到 的最少天数。
我们设计一个函数 ,表示将 减少到 的最少天数。函数 的执行过程如下:
- 如果 ,返回 ;
- 否则,我们可以先通过 次操作 ,将 减少到 的倍数,然后执行操作 ,将 减少到 ;我们也可以先通过 次操作 ,将 减少到 的倍数,然后执行操作 ,将 减少到 。我们选择上述两种方式中最少的一种,即 。
为了避免重复计算,我们使用记忆化搜索的方法,将已经计算过的 的值存储在哈希表中。
时间复杂度 ,空间复杂度 。
class Solution:
def minDays(self, n: int) -> int:
@cache
def dfs(n: int) -> int:
if n < 2:
return n
return 1 + min(n % 2 + dfs(n // 2), n % 3 + dfs(n // 3))
return dfs(n)
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | complexity depends on the approach, but memoization reduces redundant calculations. The space complexity is determined by the number of states stored in the memoization table, which is proportional to n in the worst case. |
| 空间 | Depends on the final approach |
面试官常问的追问
外企场景- question_mark
Understand state transition and recursive problem-solving techniques.
- question_mark
Test for efficiency and correct handling of large inputs.
- question_mark
Evaluate the candidate's understanding of memoization in dynamic programming.
常见陷阱
外企场景- error
Incorrect base case handling could result in infinite recursion or incorrect results.
- error
Not implementing memoization leads to redundant computations, significantly affecting performance.
- error
For large n, failing to optimize recursion depth or memoization can lead to stack overflow or slow execution.
进阶变体
外企场景- arrow_right_alt
Modify the problem to allow for other divisibility conditions (e.g., divide by 4 or 5).
- arrow_right_alt
Alter the minimum action (e.g., allow eating multiple oranges each day).
- arrow_right_alt
Extend the problem to allow additional actions like skipping days.