Leetcode.365 水壶问题
题目链接
Leetcode.365 水壶问题 mid
题目描述
有两个水壶,容量分别为 x
和 y
升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 z
升。
如果可以得到 z
升水,最后请用以上水壶中的一或两个来盛放取得的 z
升水。
你可以:
- 装满任意一个水壶
- 清空任意一个水壶
- 从一个水壶向另外一个水壶倒水,直到装满或者倒空
示例 1:
输入: jug1Capacity = 3, jug2Capacity = 5, targetCapacity = 4
输出: true
解释:来自著名的 “Die Hard”
示例 2:
输入: jug1Capacity = 2, jug2Capacity = 6, targetCapacity = 5
输出: false
示例 3:
输入: jug1Capacity = 1, jug2Capacity = 2, targetCapacity = 3
输出: true
提示:
- 1 < = x , y , z < = 1 0 6 1 <= x, y, z <= 10^6 1<=x,y,z<=106
解法一:bfs
由于题目给定的操作,我们可以将两个水壶看成一个整体,总的水量 t t t 看成是一个状态,每次操作之后只会有如下四个状态:
- t + x t + x t+x ( t + x ≤ x + y ) (t + x \leq x + y) (t+x≤x+y)
- t + y t + y t+y ( t + y ≤ x + y ) (t + y \leq x + y) (t+y≤x+y)
- t − x t - x t−x ( t − x ≥ 0 ) (t - x \geq 0) (t−x≥0)
- t − y t - y t−y ( t − y ≥ 0 ) (t - y \geq 0) (t−y≥0)
我们就可以用从初始状态 0 开始(初始两个水壶都为空,故 t = 0 t = 0 t=0) bfs,在这个过程中,我们用一个哈希表记录 已经访问过的状态。如果存在一个状态 t ′ = z t' = z t′=z,说明两个水壶可以得到 z z z 升水,故返回 true
。
bfs 结束,返回 false
。
时间复杂度: O ( n ) O(n) O(n)
C++代码:
class Solution {public:bool canMeasureWater(int x, int y, int z) {if(z > x + y) return false;unordered_set<int> vis;queue<int> q;q.push(0);vis.insert(0);while(!q.empty()){auto t = q.front();q.pop();if(t == z) return true;if(t + x <= x + y && !vis.count(t + x)){vis.insert(t + x);q.push(t + x);}if(t + y <= x + y && !vis.count(t + y)){vis.insert(t + y);q.push(t + y);}if(t - x >= 0 && !vis.count(t - x)){vis.insert(t - x);q.push(t - x);}if(t - y >= 0 && !vis.count(t - y)){vis.insert(t - y);q.push(t - y);}}return false;}
};
解法二:裴蜀定理
对于题目给定的操作,我们可以认为每次操作只会让 两个水壶的总的水量 增加 x x x , 减少 x x x ,增加 y y y,减少 y y y。
- 因为不会出现 两个桶同时有水并且都不是满的。题目给定的三种操作,无论怎么组合使用,一定至少会有一个桶为空 或者 满。
- 对一个没满的桶加水是无意义的。因为如果另一个桶是空的,那么这个操作的结果等价于直接从初始状态给这个桶加满水;而如果另一个桶是满的,那么这个操作的结果等价于从初始状态分别给两个桶加满。
- 另外,把一个不满的桶里面的水倒掉也是无意义的。因为如果另一个桶是空的,那么这个操作的结果等价于回到初始状态;而如果另一个桶是满的,那么这个操作的结果等价于从初始状态直接给另一个桶倒满。
所以实际上,每次操作只会给总的水量带来 x x x 或者 y y y 的变化量,可以用下面的式子表示:
a x + b y = z ax + by = z ax+by=z
即,裴蜀定理。
该式成立的条件是 z z z 是否能整除 g c d ( a , b ) gcd(a,b) gcd(a,b)。
时间复杂度: O ( l o g ( m i n ( x , y ) ) ) O(log(min(x,y))) O(log(min(x,y)))
C++代码:
class Solution {public:bool canMeasureWater(int x, int y, int target) {if(target > x + y) return false;return target % gcd(x,y) == 0;}
};
Leetcode.365 水壶问题相关推荐
- LeetCode 365. 水壶问题
365. 水壶问题 题目链接-365. 水壶问题 解题思路 裴蜀定理 裴蜀等式:若a,ba,ba,b是整数,且gcd(a,b)=dgcd(a,b)=dgcd(a,b)=d,那么对于任意的整数x,yx, ...
- LeetCode 365. 水壶问题(最大公约数)
文章目录 1. 题目 2. 最大公约数 1. 题目 有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的 ...
- LeetCode —— 365. 水壶问题(Python3)
有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升水. 你允许: 装满任意一 ...
- LeetCode 365水壶问题(python)
题目描述: 有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水. 你允许 ...
- 每日一题-leetcode 365. 水壶问题
有两个水壶,容量分别为 jug1Capacity 和 jug2Capacity 升.水的供应是无限的.确定是否有可能使用这两个壶准确得到 targetCapacity 升. 如果可以得到 target ...
- Leetcode 365.水壶问题
水壶问题 有两个容量分别为 x升和 y升的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水. 你允许: 装满 ...
- LeetCode——365.水壶问题【贝祖定理】
题解 AC-Code using PII = pair<int, int>;class Solution {public:bool canMeasureWater(int x, int y ...
- leetcode:365. 水壶问题【肥鼠定理,栈模拟dfs】
分析:数学 显然最后的z是a和b的线性组合 也就是ax + by = z也就是说z是(a,b)的倍数 那就直接用gcd就好了 加个特判 ac code class Solution:def canMe ...
- [LeetCode解题报告] 365. 水壶问题
[LeetCode解题报告] 365. 水壶问题 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. 题目描 ...
最新文章
- 北大开源了 Python 中文分词工具包,准确度远超 Jieba
- Css相对定位和绝对定位实现CSDN标题栏
- keil3如何放大字体_keil3如何设置字体 keil字体放大快捷键
- 织梦dedecms出现DedeCMS Error: (PHP 5.3 and above) Please set 'request_order' ini value to i解决办法...
- torch.nn.functional.pad(input, pad, mode=‘constant‘, value=0)
- 数据库-分组语句及用法
- linux 进程 命令 cat,Linux cat命令详解
- Redis:数据并发竞争顺序性
- Java反射在Main方法的中的而应用
- FISCO BCOS 微众银行 WeDPR 隐私解决方案 资料汇总
- 九、注解、有助于更好的理解框架
- 好看的php表格样式,3款精美的css3 table表格样式设计
- 信息安全常见名词解释
- CAN核心帧收发流程
- 离散数学笔记(一)【集合、命题逻辑 、谓词逻辑】
- Facebook 申请蓝色认徽章
- windows10新版java环境配置2022年4月21H1版本
- 【正点原子MP157连载】第四十章 Linux I2C驱动实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
- 系统的软中断CPU使用率升高,该怎么办?
- php 解压文件中有中文,ZipArchive 解压中文文件乱码解决方案和疑惑
热门文章
- 整理2004-2018年地级市进出口贸易总额数据
- 因为一个bug来深入探讨下分页插件PageHelper
- 一个简单的面试题 equals和==的区别
- Visualforce 标签(一)
- Flooding、Gossiping、SPIN、DD路由、Rumor路由这五个协议的区别和联系
- 像微信一样录制视频和音频
- 几款科学计算显卡对比(GTX Titan X、GTX 980、Tesla K40 K80 及quadro K4200)
- ubuntu桌面幻灯片_如何在Ubuntu中创建墙纸幻灯片
- 仅需一个app就能像homeassistant一样实现跨品牌联动?
- DTOJ 3999 ♂U♂ Xi♂