LC每日一题|20240512 - 1553. 吃掉 N 个橘子的最少天数
厨房里总共有
n个橘子,你决定每一天选择如下方式之一吃这些橘子:
- 吃掉一个橘子。
- 如果剩余橘子数
n能被 2 整除,那么你可以吃掉n/2个橘子。- 如果剩余橘子数
n能被 3 整除,那么你可以吃掉2*(n/3)个橘子。每天你只能从以上 3 种方案中选择一种方案。
请你返回吃掉所有
n个橘子的最少天数。
提示:
1 <= n <= 2*10^9
题目等级:Hard
解题思路
对于n个🍊来说,我们有以下三种方案炫掉它。
- 吃掉1个,剩
n - 1个,需要1天。 - 吃掉k个使
(n - k) % 2 == 0, 然后吃掉n / 2个,剩n / 2个,需要k + 1天。 - 吃掉k个使
(n - k) % 3 == 0, 然后吃掉2n / 3个,剩n / 3个,需要k + 1天。
最终就是递归这三种方案的最小值,不难推出,方案1在任何情况下的表现都不会好于其他两种方案。
由于数据量巨大,需要配合记忆化搜索,递归截止条件是 n == 1 。
AC代码
class Solution {
val map = HashMap<Int, Int>()
fun minDays(n: Int): Int {
if (n == 1) return n
if (map[n] != null) return map[n]!!
map[n] = Math.min(minDays(n / 2) + n % 2, minDays(n / 3) + n % 3) + 1
return map[n]!!
}
}
碎碎念
信不信我一天就能把它都炫干净!!!