题目链接

Leetcode.365 水壶问题 mid

题目描述

有两个水壶,容量分别为 xy升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 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 水壶问题相关推荐

  1. LeetCode 365. 水壶问题

    365. 水壶问题 题目链接-365. 水壶问题 解题思路 裴蜀定理 裴蜀等式:若a,ba,ba,b是整数,且gcd(a,b)=dgcd(a,b)=dgcd(a,b)=d,那么对于任意的整数x,yx, ...

  2. LeetCode 365. 水壶问题(最大公约数)

    文章目录 1. 题目 2. 最大公约数 1. 题目 有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的 ...

  3. LeetCode —— 365. 水壶问题(Python3)

    有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升水. 你允许: 装满任意一 ...

  4. LeetCode 365水壶问题(python)

    题目描述: 有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水. 你允许 ...

  5. 每日一题-leetcode 365. 水壶问题

    有两个水壶,容量分别为 jug1Capacity 和 jug2Capacity 升.水的供应是无限的.确定是否有可能使用这两个壶准确得到 targetCapacity 升. 如果可以得到 target ...

  6. Leetcode 365.水壶问题

    水壶问题 有两个容量分别为 x升和 y升的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水. 你允许: 装满 ...

  7. LeetCode——365.水壶问题【贝祖定理】

    题解 AC-Code using PII = pair<int, int>;class Solution {public:bool canMeasureWater(int x, int y ...

  8. leetcode:365. 水壶问题【肥鼠定理,栈模拟dfs】

    分析:数学 显然最后的z是a和b的线性组合 也就是ax + by = z也就是说z是(a,b)的倍数 那就直接用gcd就好了 加个特判 ac code class Solution:def canMe ...

  9. [LeetCode解题报告] 365. 水壶问题

    [LeetCode解题报告] 365. 水壶问题 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. 题目描 ...

最新文章

  1. 北大开源了 Python 中文分词工具包,准确度远超 Jieba
  2. Css相对定位和绝对定位实现CSDN标题栏
  3. keil3如何放大字体_keil3如何设置字体 keil字体放大快捷键
  4. 织梦dedecms出现DedeCMS Error: (PHP 5.3 and above) Please set 'request_order' ini value to i解决办法...
  5. torch.nn.functional.pad(input, pad, mode=‘constant‘, value=0)
  6. 数据库-分组语句及用法
  7. linux 进程 命令 cat,Linux cat命令详解
  8. Redis:数据并发竞争顺序性
  9. Java反射在Main方法的中的而应用
  10. FISCO BCOS 微众银行 WeDPR 隐私解决方案 资料汇总
  11. 九、注解、有助于更好的理解框架
  12. 好看的php表格样式,3款精美的css3 table表格样式设计
  13. 信息安全常见名词解释
  14. CAN核心帧收发流程
  15. 离散数学笔记(一)【集合、命题逻辑 、谓词逻辑】
  16. Facebook 申请蓝色认徽章
  17. windows10新版java环境配置2022年4月21H1版本
  18. 【正点原子MP157连载】第四十章 Linux I2C驱动实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
  19. 系统的软中断CPU使用率升高,该怎么办?
  20. php 解压文件中有中文,ZipArchive 解压中文文件乱码解决方案和疑惑

热门文章

  1. 整理2004-2018年地级市进出口贸易总额数据
  2. 因为一个bug来深入探讨下分页插件PageHelper
  3. 一个简单的面试题 equals和==的区别
  4. Visualforce 标签(一)
  5. Flooding、Gossiping、SPIN、DD路由、Rumor路由这五个协议的区别和联系
  6. 像微信一样录制视频和音频
  7. 几款科学计算显卡对比(GTX Titan X、GTX 980、Tesla K40 K80 及quadro K4200)
  8. ubuntu桌面幻灯片_如何在Ubuntu中创建墙纸幻灯片
  9. 仅需一个app就能像homeassistant一样实现跨品牌联动?
  10. DTOJ 3999 ♂U♂ Xi♂