【经典算法题】水壶问题
【经典算法题】水壶问题
Leetcode 0365 水壶问题
题目描述:Leetcode 0365 水壶问题
分析
本题的考点:数学、欧几里得算法。
两个水壶记为
A、B
。A、B
这两个水壶都是及不空也不满,这种情况是不可能存在的。这是因为我们的三种操作所决定的。我们考虑将两个水壶看成一体,考虑整个整体和外界交换的水量,在最优操作情况下(即操作次数最少的情况下),每次和外界交换的水量只可能是
+x、-x、+y、-y
。原因如下:假设现在A
中有水但是不满,则B
中要么是空要么是满,此时将A
加满或者将A
倒空和外界交换的水量不是上述情况,如果这样操作可以得到解,不如上来直接让A
为空或者为满,这样操作次数更少。考虑这个整体和外界交换水量为
x、y
的次数分别为a、b
,如果有a×x+b×y==za \times x + b \times y ==za×x+b×y==z,则说明存在解。因此我们需要判断是否存在这样的
a、b
使得a×x+b×y==za \times x + b \times y ==za×x+b×y==z,这就是裴淑定理。可以参考:扩展欧几里得算法。这里如果
x、y
的最大公约数可以整除c
,就存在a、b
。那我们能构造出这组解吗?如果
z>x+y
,说明一定不存在解。否则可以构造出这组解。下面给出构造过程:(1)首先
a、b
不可能都小于0,因为右侧是c
是大于0的,如果a、b
都大于0,则说明a、b
都等于1,z=x+y
;(2)当有一个大于0,一个小于等于0时,比如
a>0,b<=0
,则我们可以向A
中加满水,然后将A
中的水倒到B
中,直到水壶A
被加了a
次水,水壶B
倒掉了b
次水既可以得到结果。
代码
- C++
class Solution {public:bool canMeasureWater(int x, int y, int z) {if (z > x + y) return false;return !z || z % gcd(x, y) == 0;}int gcd(int a, int b) {return b ? gcd(b, a % b) : a;}
};
- Java
class Solution {public boolean canMeasureWater(int x, int y, int z) {if (z > x + y) return false;return z == 0 || z % gcd(x, y) == 0;}private int gcd(int a, int b) {return b != 0 ? gcd(b, a % b) : a;}
}
时空复杂度分析
时间复杂度:O(log(n))O(log(n))O(log(n)),
n
为求最大公约数的数的大小。空间复杂度:O(1)O(1)O(1)。
【经典算法题】水壶问题相关推荐
- 经典算法题每日演练——第六题 协同推荐SlopeOne 算法
原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,"商品推荐","猜你喜欢&quo ...
- 经典算法题每日演练——第二十二题 奇偶排序
原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个&qu ...
- 经典算法题每日演练——第十九题 双端队列
经典算法题每日演练--第十九题 双端队列 原文:经典算法题每日演练--第十九题 双端队列 话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in ...
- 经典算法题每日演练——第十题 树状数组
原文:经典算法题每日演练--第十题 树状数组 有一种数据结构是神奇的,神秘的,它展现了位运算与数组结合的神奇魅力,太牛逼的,它就是树状数组,这种数据结构不是神人是发现不了的. 一:概序 假如我现在有个 ...
- 经典算法题每日演练——第一题 百钱买百鸡
经典算法题每日演练--第一题 百钱买百鸡 原文:经典算法题每日演练--第一题 百钱买百鸡 百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱, ...
- python全排序算法题_Python的100道经典算法题(1)
按照c语言的100道经典算法题,自己原创写的,就得是自己的练习题了 [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数 ...
- java经典100例算法题_10道java经典算法题,每一题都能帮你提升java水平!
JAVA经典算法题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子 ...
- 经典算法题每日演练——第七题 KMP算法
原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...
- 每日经典算法题(十六) 九九乘法表
每日经典算法题(十六) 九九乘法表 九九乘法表:Multiplication Table 99 题目 输出 9 * 9 口诀 程序分析 分行与列考虑,共9行9列,i 控制行,j 控制列 思路 非常经典 ...
最新文章
- 如何创建启动界面Splash Screen
- php 26个字母大写,英语26个字母大小写怎么写
- QT的QBluetoothTransferManager类的使用
- Docker 环境的快速搭建
- 壁纸:换一张自己喜欢的手机壁纸
- 【渝粤教育】国家开放大学2018年秋季 0008-22T简明现代汉语 参考试题
- c语言数组的使用步骤,C语言中为什么要使用数组?详细图解数组的使用
- python sftp连接_Python 脚本:创建SFTP连接传输数据
- python解读器_Python装饰器完全解读
- ubuntu16.04下Qt无法输入中文注释
- 电容式触摸感应按键解决方案(转载)
- Python图像处理应用之绘制log函数图像
- python去除图片马赛克_python 检测图片是否有马赛克
- 基2FFT的matlab实现
- 如何删除本地/远程Git分支
- C++ Reference: Standard C++ Library reference: C Library: cmath: cosh
- 面试题 16.17. 连续数列
- 【LSTM+embeddingbag】进行文本分类完整代码~
- 第三章 打造高性能的视频弹幕系统
- 旅游平台分账模式是什么样的?
热门文章
- HIVE SQL 聚合函数与 rows between / range between详解
- ToolStripMenuItem
- 数据结构C语言版(清华大学_唐国民_第3版)单链表
- MOOC-浙江大学-博弈论基础-学习笔记(一)
- 数据中台-实施篇:数据中台方法论简述
- c语言程序从main()函数开始执行,所以这个函数要写在( ).,C语言程序从main()函数开始执行,所以这个函数要写在( )。...
- mysql表中的中文是乱码_mysql插入表中的中文显示为乱码或问号的解决方法
- nginx proxy_pass缓存静态资源html和js导致的问题
- 极客时间学习笔记-左耳听风
- ubuntu20.04 安装TeamViewer