LC每日一题|20240512 - 1553. 吃掉 N 个橘子的最少天数

89 阅读1分钟

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]!!
    }
}

碎碎念

信不信我一天就能把它都炫干净!!!