题目来源
我的题解
方法一 双指针
使用两个指针t1和t2记录Alice和Bob当前还未浇水的植物,使用变个变量cap1和cap2表示Alice和Bob当前剩余的水量。
两端同时浇水,若不能同时浇水则需要判断哪一个需要回去取水,并将结果加1;
若浇水到两个同时浇一个植物,判断是否其中一人可以浇完,若可以则不再取水;若不可以,则需要判断哪个剩余的水多,剩的多的不再取水,由剩的少的回去取水
时间复杂度:O(n)
空间复杂度:O(1)
public int minimumRefill(int[] plants, int capacityA, int capacityB) {
int res=0;
int t1=0,t2=plants.length-1;
int cap1=capacityA;
int cap2=capacityB;
while(t1<=t2){
//两个都还有足够的水
while(t1<=t2&&(cap1>=plants[t1]&&cap2>=plants[t2])){
//表示已经把所有植物浇完
if(t1==t2){
t1++;
break;
}
//Alice足够浇水当前植物
cap1-=plants[t1];
t1++;
//Bob足够浇水当前植物
cap2-=plants[t2];
t2--;
}
//还未浇完
if(t1<t2){
//Alice的水不够
if(cap1<plants[t1]){
res+=1;
cap1=capacityA;
}
//Bob的水不够
if(cap2<plants[t2]){
res+=1;
cap2=capacityB;
}
//已经到达同一个位置
}else if(t1==t2){
//若两个中有其一的能够浇完
if(cap1>=plants[t1]||cap2>=plants[t2]){
break;
}
//到达最后一个植物,Alice的水比Bob多或者相同
if(cap1>=cap2){
plants[t1]-=cap1;
cap1=capacityA;
//到达最后一个植物,Alice的水比Bob少
}else{
plants[t2]-=cap2;
cap2=capacityB;
}
res+=1;
}
}
return res;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~