Minimum Number of Days to Eat N Oranges

There are n oranges in the kitchen and you decided to eat some of these oranges every day as follows:

  • Eat one orange.
  • If the number of remaining oranges (n) is divisible by 2 then you can eat  n/2 oranges.
  • If the number of remaining oranges (n) is divisible by 3 then you can eat  2*(n/3) oranges.

You can only choose one of the actions per day.

Return the minimum number of days to eat n oranges.

Example 1:

Input: n = 10
Output: 4
Explanation: You have 10 oranges.
Day 1: Eat 1 orange,  10 - 1 = 9.  
Day 2: Eat 6 oranges, 9 - 2*(9/3) = 9 - 6 = 3. (Since 9 is divisible by 3)
Day 3: Eat 2 oranges, 3 - 2*(3/3) = 3 - 2 = 1. 
Day 4: Eat the last orange  1 - 1  = 0.
You need at least 4 days to eat the 10 oranges.

思路:就是一个BFS + Set去重。

class Solution {
    public int minDays(int start) {
        Queue<Integer> queue = new LinkedList<Integer>();
        queue.offer(start);
        
        int step = 0;
        HashSet<Integer> set = new HashSet<Integer>();
        while(!queue.isEmpty()) {
            int size = queue.size();
            for(int i = 0; i < size; i++) {
                Integer n = queue.poll();
                if(n == 0) {
                    return step;
                }
                if(!set.contains(n - 1)) {
                    queue.offer(n - 1);
                    set.add(n - 1);
                }
                if(n % 2 == 0) {
                    if(!set.contains(n - n / 2)) {
                        queue.offer(n - n / 2);
                        set.add(n - n / 2);
                    }
                }
                if(n % 3 == 0) {
                    if(!set.contains(n - 2 *(n / 3))) {
                        queue.offer(n - 2 *(n / 3));
                        set.add(n - 2*(n / 3));
                    }
                }
            }
            step++;
        }
        return step;
    }
}

这题可以用DFS做, 还有个拐点就是:n %2 != 0  n % 3 != 0,那么代表n % 2, n % 3那些点是我们需要一个个吃的;

So, the real choice we have is to eat n % 2 oranges one-by-one and then swallow n / 2, or eat n % 3 oranges so that we can gobble 2 * n / 3.

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值