leetcode困难1553吃掉 N 个橘子的最少天数

Posted qq_40707462

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode困难1553吃掉 N 个橘子的最少天数相关的知识,希望对你有一定的参考价值。

厨房里总共有 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 个橘子。

思路:递归 / 记忆化搜索 / 动态规划
使只吃掉一个橘子的操作尽可能少,另外两种操作尽可能多

递归:

class Solution 
    public int minDays(int n) 
        if(n<3) return n;
        if(n==3) return 2;
        return Math.min((n%3)+minDays(n/3), (n%2)+minDays(n/2))+1;
    

动态规划:

class Solution 
    Map<Integer, Integer> memo = new HashMap<Integer, Integer>();
    public int minDays(int n) 
        if (n <= 1) return n;
        if (memo.containsKey(n)) return memo.get(n);
        memo.put(n, Math.min(n%2+1+minDays(n/2), n%3+1+minDays(n/3)));
        return memo.get(n);
    

以上是关于leetcode困难1553吃掉 N 个橘子的最少天数的主要内容,如果未能解决你的问题,请参考以下文章

leetcode困难887鸡蛋掉落

Leetcode之广度优先搜索(BFS)专题-994. 腐烂的橘子(Rotting Oranges)

LeetCode——994. 腐烂的橘子

[LeetCode] 994. Rotting Oranges

leetcode.994腐烂的橘子

Leetcode 994. 腐烂的橘子