| Category | Difficulty | Likes | Dislikes | 
|---|
| algorithms | Hard (26.35%) | 96 | - | 
Tags
Unknown
Companies
Unknown
厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子:
- 吃掉一个橘子。
 - 如果剩余橘子数 
n 能被 2 整除,那么你可以吃掉 n/2 个橘子。 - 如果剩余橘子数 
n 能被 3 整除,那么你可以吃掉 2*(n/3) 个橘子。 
每天你只能从以上 3 种方案中选择一种方案。
请你返回吃掉所有 n 个橘子的最少天数。
示例 1:
1
2
3
4
5
6
7
8
  | 输入: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:
1
2
3
4
5
6
7
  | 输入: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:
示例 4:
提示:
Discussion | Solution
通过HashMap剪支,加快结果,时间复杂度$O(log(n))$。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
  | use std::collections::HashMap;
use std::cmp;
impl Solution {
    pub fn min_days(n: i32) -> i32 {
        let mut record = HashMap::new();  //记录已经吃过的方法
        Self::eat(n, &mut record)
    }
    pub fn eat(n: i32, record: &mut HashMap<i32, i32>) -> i32 {
        match n {
            0 | 1 => n,
            i if record.contains_key(&i) => *record.get(&i).unwrap(),
            _ => {
                let res = cmp::min(Self::eat(n/2, record) + n%2, Self::eat(n/3, record) + n%3) + 1;
                record.insert(n, res);
                res
            }
        }
    }
}
  | 
通过数组缓存所有结果,时间复杂度:$O(n)$, leetcode超时;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  |     pub fn min_days(n: i32) -> i32 {
        if n < 2 {
            return n;
        }
        let mut res: Vec<i32> = vec![0 , 1];
        for i in 2..n+1 {
            res.push(cmp::min(res[(i/2) as usize] + i%2, res[(i/3) as usize] + i%3) + 1);
        }
        return res[n as usize];
    }
  |