题目来源
我的题解
方法一 模拟
依次模拟浇水动作
使用一个变量 cap维护剩余的水量,使用t作为还未浇水的树的下标。当从第 i−1株植物到达第 i株植物时:
- 如果 cap≥plants[i],那么可以完成浇水,需要的步数就是从 i−1 到 i 的 1 步,总步数加1;
- 如果 rest<plants[i],那么无法完成浇水,必须要返回河边装满水罐,需要的步数为:2*t。
依次模拟遍历
当模拟完成所有 n 株植物的浇水过程之后,就可以返回总步数作为答案。
时间复杂度:O(n)
空间复杂度:O(1)
public int wateringPlants(int[] plants, int capacity) {
int res=0;//最红结果
int t=0;//已经当前还未浇水的树的位置
int cap=capacity;//剩余水量
while(t<plants.length){
// 当还够浇水
while(t<plants.length&&cap>=plants[t]){
cap-=plants[t];
t++;
res+=1;
}
//只要还未浇完水,需要返回取水,来回两次的距离
if(t!=plants.length){
res+=2*t;
cap=capacity;
}
}
return res;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~