本题难度:
中等
本题思路:
只给了两个容器,假设容量分别是x和y,用这两个容器来凑目标容量z的水。容器不是量器,只可能有以下几种情况,分别是向某容器加满水,从某容器倒空水,某容器往另一个容器倒水直到自己倒空或者另一个容器被倒满,最终得到的目标容量的水其实就是经过以上几种操作之后两个容器内的水的总量。无论是哪种操作移动的水的容量总是当中一个容器的容量的整数倍,列出一个公式就是ax+by=z,z只要是x和y的最大公约数的整数倍就可以满足条件。
本题代码:
class Solution {
public boolean canMeasureWater(int jug1Capacity, int jug2Capacity, int targetCapacity) {
if(jug1Capacity + jug2Capacity < targetCapacity || jug1Capacity == 0 && jug2Capacity != targetCapacity || jug2Capacity == 0 && jug1Capacity != targetCapacity)
return false;
int a = jug1Capacity, b = jug2Capacity, temp = 0;
while(b != 0){
temp = a % b;
a = b;
b = temp;
}
if(targetCapacity % a == 0)
return true;
else
return false;
}
}
本题复杂度:
时间复杂度T(n)=O(log(min(x,y)))——取决于计算最大公约数所使用的辗转相除法
空间复杂度S(n)=O(1)