Every day a Leetcode
题目来源:2105. 给植物浇水 II
解法1:双指针
设 Alice 当前下标为 i,初始化为 0,水量为 a,初始化为 capacityA;Bob 当前下标为 j,初始化为 n-1,水量为 b,初始化为 capacityB。
Alice 按从左到右的顺序给植物浇水,如果 a < plants[i],需要重新灌满水罐,次数 +1。然后浇水,a = capacityA - plants[i],i++。同理,Bob 按从右到左的顺序给植物浇水,如果 b < plants[j],需要重新灌满水罐,次数 +1。然后浇水,b = capacityB - plants[j],j–。
还需要特判一种情况:当 i == j && max(a, b) < plants[i] 时,Alice 重新灌满水罐并浇水,次数 +1。
最后返回次数。
代码:
/*
* @lc app=leetcode.cn id=2105 lang=cpp
*
* [2105] 给植物浇水 II
*/
// @lc code=start
class Solution
{
public:
int minimumRefill(vector<int> &plants, int capacityA, int capacityB)
{
int n = plants.size();
int i = 0, j = n - 1;
int a = capacityA, b = capacityB;
int count = 0;
while (i < j)
{
if (a < plants[i])
{
a = capacityA;
count++;
}
a -= plants[i];
i++;
if (b < plants[j])
{
b = capacityB;
count++;
}
b -= plants[j];
j--;
}
if (i == j && max(a, b) < plants[i])
count++;
return count;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是数组 plants 的长度。
空间复杂度:O(1)。