leetcode
leetcode 1851 ~ 1900
给植物浇水 II

给植物浇水 II

难度:

标签:

题目描述

代码结果

运行时间: 76 ms, 内存: 29.7 MB


/*
 * 思路:
 * 1. 初始化 Alice 和 Bob 的水罐容量为 capacityA 和 capacityB。
 * 2. 使用两个指针,分别从左向右(Alice)和从右向左(Bob)遍历植物数组。
 * 3. 当 Alice 或 Bob 的水量不足时,增加补水次数,并将水罐重新灌满。
 * 4. 如果 Alice 和 Bob 同时到达同一株植物,则由水量更多的一方浇水,若水量相同则由 Alice 浇水。
 * 5. 返回补水次数的总和。
 * 由于 Java Stream 不太适合这种双指针操作,仍需使用传统循环实现。
 */

public class Solution {
    public int wateringPlants(int[] plants, int capacityA, int capacityB) {
        int n = plants.length;
        int left = 0, right = n - 1;
        int waterA = capacityA, waterB = capacityB;
        int refills = 0;

        while (left <= right) {
            if (left == right) {
                if (waterA >= waterB) {
                    if (waterA < plants[left]) {
                        refills++;
                        waterA = capacityA;
                    }
                    waterA -= plants[left];
                } else {
                    if (waterB < plants[left]) {
                        refills++;
                        waterB = capacityB;
                    }
                    waterB -= plants[left];
                }
                break;
            }
            if (waterA < plants[left]) {
                refills++;
                waterA = capacityA;
            }
            waterA -= plants[left];
            left++;

            if (waterB < plants[right]) {
                refills++;
                waterB = capacityB;
            }
            waterB -= plants[right];
            right--;
        }

        return refills;
    }
}

解释

方法:

该题解使用两个指针分别代表 Alice 和 Bob 从两端向中间浇水的过程。Alice 从左侧开始,Bob 从右侧开始,直到他们相遇或者交叉。每次浇水前,检查当前的水量是否足够浇下一株植物,如果不够则重新装满水罐并增加填充次数。对于中间相遇的情况,选择水量更多的一方进行浇水,如果水量相同,则Alice浇水。这种方式确保了每次操作都是最优的,并且在遍历一次植物数组后得到结果。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
在解题方法中,为什么选择在Alice和Bob到达同一株植物时由水量更多的一方进行浇水,而不是固定由一个人浇水?
选择水量更多的一方进行浇水是为了最大化利用现有的水资源并减少重新装满水罐的次数。如果固定由一个人浇水,可能会造成另一方尚有足够水量而未使用,这样就可能增加不必要的水罐填充次数。此策略确保每次浇水都尽可能利用现有水量,从而提高水资源的使用效率。
🦆
在算法中,Alice和Bob在浇水前检查水量是否足够的逻辑是否能保证在所有情况下都能有效减少水罐的重新填充次数?
是的,这种检查确保在每次浇水前水量都是足够的。如果水量不足,他们会重新填满水罐,这个机制避免了在浇水过程中出现中断,从而优化了浇水过程。尽管如此,这种策略并不总是最小化填充次数,因为最优填充策略可能需要更复杂的考量,如特定的水量分配策略或预测接下来的水需求等。
🦆
实现代码中,在Alice和Bob相遇且都需要重新装满水罐时,你是如何决定增加的填充次数的?
在代码实现中,Alice和Bob相遇时,如果他们的水量都不足以浇水,则会分别检查并重新填充他们的水罐。每次重新填充都会相应地增加填充次数。如果同时需要填充,则填充次数会增加两次。这种处理方式确保了每个操作者都有足够的水进行浇水,同时也记录了正确的填充次数。
🦆
算法设计中是否考虑了所有边界情况,例如植物数组为空或只有一株植物时的情况?
算法考虑了包括植物数组为空和只有一株植物的边界情况。当数组为空时,Alice和Bob不需要进行任何操作,此时填充次数自然为0。如果只有一株植物,那么根据算法逻辑,Alice和Bob会在这株植物处相遇,并由水量更多的一方(或Alice,如果水量相同)进行浇水。这确保了算法在所有情况下都能正确运作。

相关问题