LeetCode-365. Water and Jug Problem (JAVA)水罐盛水问题

本文探讨了给定两个容量分别为x和y升的罐子时,如何判断能否通过一系列操作恰好量出z升水的问题。文章提供了详细的解决方案及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

365. Water and Jug Problem

You are given two jugs with capacitiesx andy litres. There is an infinite amount of water supply available.You need to determine whether it is possible to measure exactlyz litres using these two jugs.

If z liters of water is measurable, you must havez liters of water contained withinone or both buckets by the end.

Operations allowed:

  • Fill any of the jugs completely with water.
  • Empty any of the jugs.
  • Pour water from one jug into another till the other jug is completely full or the first jug itself is empty.

Example 1: (From the famous "Die Hard" example)

Input: x = 3, y = 5, z = 4
Output: True

Example 2:

Input: x = 2, y = 6, z = 5
Output: False

给定两个容量分别为x和y升的罐子。提供无限容量的水。你需要判断用这两个罐子是否可以恰好量出z升的体积。到最后量出的z升体积可以由一到两个罐子装着。

允许的操作包括:

1、将任意罐子灌满。

2、将任意罐子清空。

3、将任意罐子的水倒入另一个罐子,直到另一个罐子倒满或者自己为空为止。

思路:

求最大公约数GCD(Greatest Common Divisor)。

如果x与y互质(最大公约数为1),则容量范围[1, max(x, y)]之内的任意整数体积均可以通过适当的操作得到。

否则,记x与y的最大公约数为gcd,则可以获得的容量z只能为gcd的整数倍,且z <= max(x, y)。

public boolean canMeasureWater(int x, int y, int z) {
		// 最后可量的水可以装在一个或者两个罐子内
		if (z > x + y)
			return false;
		if (z == 0)
			return true;
		int res = gcd(x, y);
		return z % res == 0;
	}
// 递归求最大公约数
	private int gcd(int x, int y) {

		return y == 0 ? x : gcd(y, x % y);
	}

// 迭代
	public int gcd(int x, int y) {
		while (y != 0) {
			int temp = y;
			y = x % y;
			x = temp;
		}
		return x;
	}
参考:http://blog.youkuaiyun.com/aishangyutian12/article/details/51762532


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值