原标题:每天一道算法题-一行代码解决两个水杯分水问题
问题描述
有两个水杯,容量分别为x升和y升。水不限量。问能否用这两个杯子分出z升水。注意,没有其他容器,分完后,这z升水必须还在这两个杯子中。
可进行以下操作:
把任意一个杯子装满水
把任意一个杯子中的水全部倒出
把杯子1的水倒入杯子2中,直到杯子1装满,或杯子1清空
栗子
Input: x = 3, y = 5, z = 4
Output: True
先把y装满,然后用y把x装满,此时x=3,y=2;
清空x,把y的2倒入x,此时x=2,y=0;
再装满y,再用y装满x,此时x=3,y=4,拿到答案Bingo!
Input: x = 2, y = 6, z = 5
Output: False
捣鼓不出5升水,sad...
思路
这道题其实是一道数学题,虽然据说微软的面试考过这道题。
数论中,有一个裴蜀定理( Bézout's identity),说明了对任何整数x、y和它们的最大公约数d,一定存在整数a,b,使ax+by=d成立。
因此,只要满足z是GCD(x, y)的倍数,即可捣鼓出z升水。GCD(x, y)代表x,y的最大公约数。
所以,一行代码搞定!
C++代码
其中__gcd()是C++内置函数。
参考资料:
Leetcode 第365题, https://leetcode.com/problems/water-and-jug-problem/返回搜狐,查看更多
责任编辑: