Leetcode 875:Koko 吃香蕉

问题描述 投票:0回答:1

Leetcode 875:Koko 吃香蕉

科科喜欢吃香蕉。有n堆香蕉,第i堆有piles[i]根香蕉。警卫已经走了,h小时后就会回来。

Koko 可以决定她每小时吃香蕉的速度 k。每个小时,她都会选择一些香蕉并从该堆中吃掉 k 个香蕉。如果这堆香蕉少于 k 个,她会吃掉所有香蕉,并且在这一小时内不会再吃更多香蕉。

科科喜欢慢慢吃,但仍然想在守卫回来之前吃完所有香蕉。

返回最小整数k,使得她可以在h小时内吃完所有香蕉。

示例1:

输入:桩 = [3,6,7,11], h = 8
输出:4

示例2:

输入:桩 = [30,11,23,4,20], h = 5
输出:30

示例3:

输入:桩 = [30,11,23,4,20], h = 6
输出:23

import java.util.Arrays;

class Solution {
    public int minEatingSpeed(int[] piles, int h) {
        Arrays.sort(piles);

        int j = 0;
        int high = piles[piles.length-1];
      int i = 0;
      int k;
      outerLoop1:
        for( k = piles[0]; k <= high; k++) {
            while (j <= h && i < piles.length) {
                if (piles[i] > 0) {
                    piles[i] = piles[i] - k;
                }
                j++;
                i++;
                if (i == piles.length) {
                    i = 0;
                }
            }
            outerLoop:
            if (j == h) {
                int f = 0;
                while (f < piles.length) {
                    if (piles[i] > 0) {
                        break outerLoop;
                    } else {
                        f++;
                    }
                    
                }
                break outerLoop1;
            }
        }
        return k;
    }
}

我知道我应该使用二分搜索来解决这个问题,但我采用了不同的方法。

我从 k 的最低值(即堆中的最低 val)开始运行 for 循环,一直到最高的值,在堆中的所有内容都为 0 或 1 时返回 k(在从中重复减去 k 之后) )。如果情况并非如此,我会增加 k 并重试。据我了解,break outerLoop 脱离了 if 语句,并且 k 递增。而break outerLoop1 脱离了 k 的最外层 for 循环并且返回了 k,因为我找到了我需要的 k 的值。

我的逻辑有什么问题吗?

我不需要这个问题的解决方案,只需澄清我的特定版本的代码究竟出了什么问题,以及我可以进行哪些调整来修复它,按照我现在的方式处理它。

java binary-search
1个回答
1
投票

我从 k 的最低值(即堆中的最低 val)开始运行 for 循环

为什么 k 的最小可能值是堆中的最小值?举个例子:

piles={8};h=8
。这里,最小值是 1,但你的算法永远不会检查这种情况,因为它从 8 开始检查。

© www.soinside.com 2019 - 2024. All rights reserved.