给植物浇水 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相遇且都需要重新装满水罐时,你是如何决定增加的填充次数的?
▷🦆
算法设计中是否考虑了所有边界情况,例如植物数组为空或只有一株植物时的情况?
▷