java 水杯问题_每天一道算法题-一行代码解决两个水杯分水问题

原标题:每天一道算法题-一行代码解决两个水杯分水问题

9d118e77e123135ed49dfaf289c2c1fa.png

问题描述

有两个水杯,容量分别为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++内置函数。

139e0267f169dd18f2fc51bf25606bf8.png

参考资料:

Leetcode 第365题, https://leetcode.com/problems/water-and-jug-problem/返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值