【经典算法题】水壶问题

Leetcode 0365 水壶问题

题目描述:Leetcode 0365 水壶问题

分析

  • 本题的考点:数学、欧几里得算法

  • 两个水壶记为A、BA、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)。

【经典算法题】水壶问题相关推荐

  1. 经典算法题每日演练——第六题 协同推荐SlopeOne 算法

    原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,"商品推荐","猜你喜欢&quo ...

  2. 经典算法题每日演练——第二十二题 奇偶排序

    原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个&qu ...

  3. 经典算法题每日演练——第十九题 双端队列

    经典算法题每日演练--第十九题 双端队列 原文:经典算法题每日演练--第十九题 双端队列 话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in ...

  4. 经典算法题每日演练——第十题 树状数组

    原文:经典算法题每日演练--第十题 树状数组 有一种数据结构是神奇的,神秘的,它展现了位运算与数组结合的神奇魅力,太牛逼的,它就是树状数组,这种数据结构不是神人是发现不了的. 一:概序 假如我现在有个 ...

  5. 经典算法题每日演练——第一题 百钱买百鸡

    经典算法题每日演练--第一题 百钱买百鸡 原文:经典算法题每日演练--第一题 百钱买百鸡 百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱, ...

  6. python全排序算法题_Python的100道经典算法题(1)

    按照c语言的100道经典算法题,自己原创写的,就得是自己的练习题了 [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数 ...

  7. java经典100例算法题_10道java经典算法题,每一题都能帮你提升java水平!

    JAVA经典算法题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子 ...

  8. 经典算法题每日演练——第七题 KMP算法

    原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...

  9. 每日经典算法题(十六) 九九乘法表

    每日经典算法题(十六) 九九乘法表 九九乘法表:Multiplication Table 99 题目 输出 9 * 9 口诀 程序分析 分行与列考虑,共9行9列,i 控制行,j 控制列 思路 非常经典 ...

最新文章

  1. 如何创建启动界面Splash Screen
  2. php 26个字母大写,英语26个字母大小写怎么写
  3. QT的QBluetoothTransferManager类的使用
  4. Docker 环境的快速搭建
  5. 壁纸:换一张自己喜欢的手机壁纸
  6. 【渝粤教育】国家开放大学2018年秋季 0008-22T简明现代汉语 参考试题
  7. c语言数组的使用步骤,C语言中为什么要使用数组?详细图解数组的使用
  8. python sftp连接_Python 脚本:创建SFTP连接传输数据
  9. python解读器_Python装饰器完全解读
  10. ubuntu16.04下Qt无法输入中文注释
  11. 电容式触摸感应按键解决方案(转载)
  12. Python图像处理应用之绘制log函数图像
  13. python去除图片马赛克_python 检测图片是否有马赛克
  14. 基2FFT的matlab实现
  15. 如何删除本地/远程Git分支
  16. C++ Reference: Standard C++ Library reference: C Library: cmath: cosh
  17. 面试题 16.17. 连续数列
  18. 【LSTM+embeddingbag】进行文本分类完整代码~
  19. 第三章 打造高性能的视频弹幕系统
  20. 旅游平台分账模式是什么样的?

热门文章

  1. HIVE SQL 聚合函数与 rows between / range between详解
  2. ToolStripMenuItem
  3. 数据结构C语言版(清华大学_唐国民_第3版)单链表
  4. MOOC-浙江大学-博弈论基础-学习笔记(一)
  5. 数据中台-实施篇:数据中台方法论简述
  6. c语言程序从main()函数开始执行,所以这个函数要写在( ).,C语言程序从main()函数开始执行,所以这个函数要写在( )。...
  7. mysql表中的中文是乱码_mysql插入表中的中文显示为乱码或问号的解决方法
  8. nginx proxy_pass缓存静态资源html和js导致的问题
  9. 极客时间学习笔记-左耳听风
  10. ubuntu20.04 安装TeamViewer