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)。