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

  • 一、 题目
    • 1. 题目描述
    • 2. 原题链接
  • 二、 解题报告
    • 1. 思路分析
    • 2. 复杂度分析
    • 3. 代码实现
  • 三、 本题小结

一、 题目

1. 题目描述

2. 原题链接

链接: 365. 水壶问题

二、 解题报告

1. 思路分析

 水壶倒水问题非常经典,这里用BFS解决复杂度较高,实际上可以用裴蜀定理,直接一个GCD最大公倍数的复杂度就可以搞定,在此不展开。
  • 为了方便我们即两个水壶的容量是j1,j2,目标值是t. 过程中两个水壶实际装水量记a,b。
  • 我们这里用BFS做,状态记录两个水壶分别的装水量,即(a,b)
  • 当a+b==t时,达成目标,返回True。
  • 我们详细分析题目给出的每步中的三种操作,发现其实不是三种:
  • 把a变成0或j1(2种操作)
  • 把b变成0或j2(2种)
  • 前两个操作比较简单,共四种;第三个操作看似是一个卷积四种,但我们仔细分析发现只有两种:
  • 假设从a向b倒水,直到装满或倒空,这里只会b装满或a倒空,a不会变满;同时这两种操作不能分别达成,因为ab在某个状态是固定的。但可以同时达成。也就是说这个动作只会有一个转移结果。
  • 具体转移到多少,即从a向b倒多少水,显然取决于a有多少水或b还能乘多少,diff=min(a,j2-b),然后计算转移后的状态即可;
  • 反过来从b向a倒水同理。
  • 因此我们只需在代码里模拟这个状态转移过程并加入队列即可。
  • 为了不重复搜索还需要一个visited集合来记录已访问过的状态。

2. 复杂度分析

最坏时间复杂度O(x×y)

3. 代码实现

BFS

class Solution:def canMeasureWater(self, jug1Capacity: int, jug2Capacity: int, targetCapacity: int) -> bool:vis = {(0,0)}q = deque(vis)while q:a,b = q.popleft()if a+b == targetCapacity:return True for c,d in (0,b),(a,0),(jug1Capacity,b),(a,jug2Capacity):            if (c,d) not in vis:vis.add((c,d))q.append((c,d))diff = min(jug2Capacity-b,a)c,d = a-diff,b+diffif (c,d) not in vis:vis.add((c,d))q.append((c,d))diff = min(jug1Capacity-a,b)c,d = a+diff,b-diffif (c,d) not in vis:vis.add((c,d))q.append((c,d))return False

三、 本题小结

  1. 遇到这种问题不要慌直接搜索。
  2. 当搜索状态无限多的时候可以随手想一个上下边界。当然这题显然不是无限多,因此用vis即可。

[LeetCode解题报告] 365. 水壶问题相关推荐

  1. [LeetCode解题报告] LCP 48. 无限棋局

    [LeetCode解题报告] LCP 48. 无限棋局 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. ...

  2. LeetCode解题报告汇总

    LeetCode解题报告: [LeetCode]1.Two Sum - Yoona - 博客频道 - CSDN.NET [LeetCode]2.Add Two Numbers - Yoona - 博客 ...

  3. [LeetCode解题报告] 741. 摘樱桃

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

  4. [LeetCode解题报告] LCP 49. 环形闯关游戏

    [LeetCode解题报告] LCP 49. 环形闯关游戏 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 四. 参考链接 ...

  5. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

  6. 【LeetCode解题报告】《算法基础006_日期算法》- Java

    目录 一.一周中的第几天 1.题目 2.分析 3.代码 二.一年中的第几天 1.题目 2.分析 3.代码 三.日期之间隔几天 1.题目 2.分析 3.代码 一.一周中的第几天 1.题目 1185.一周 ...

  7. leetcode解题报告:188 Best Time to Buy and Sell Stock IV

    问题: 给定一个列表,第i个元素代表股票第i天的价值,最多只允许买入卖出k次,求最大收益 思路:动态规划 输入为列表p1p2...pm 代码:Python 转载于:https://blog.51cto ...

  8. leetcode解题报告:198 House Robber

    问题描述: 一个小偷去一个街区偷东西,求偷得价值最大,唯一限制就是不能偷连续的两家,因为这样会触发警报. 建模: 给定一个列表,里面存着每家可以偷的价值,输出最大偷到的价值. 思路:动态规划 如果输入 ...

  9. leetcode解题报告:Interleaving String

    问题描述: 给定两个字符串s1, s2,判断字符串s3是否是由s1.s2交错构成. 例子: s1 = "aabcc", s2 = "dbbca", When s ...

最新文章

  1. js pug 代码_用JS写的windows95操作系统
  2. python中的栈结构_对Python列表进行封装和二次开发实现自定义栈结构
  3. 【HTTP】另类的POST头数据 RFC1867协议格式简析
  4. EF调用存储过程实现分页
  5. navicat循环执行上下两行相减sql语句_SQL语句的优化分析
  6. 初学echart的简单使用
  7. LeetCode 80. 删除排序数组中的重复项 II
  8. number输入框限制输入数字位数、字体随数字长度变化
  9. 利用SuppressMessage来阻止FxCop进行代码分析时报出的警告
  10. 学习设计模式 - 六大基本原则之开闭原则
  11. mysql开发要注意什么_Mysql日常开发注意要点
  12. STM32的备份寄存器和控制状态寄存器
  13. 软件工程之图书管理系统总体设计
  14. java60秒倒计时
  15. 贪心算法——国王游戏(洛谷P1080)
  16. lambda表达式写法
  17. 服务器内存怎么看型号,怎么查看服务器内存的型号
  18. 一场先进技术与先锋企业碰撞的知识盛宴!弘玑Cyclone『超级自动化的数字内生力量』CXO私享会成功举办
  19. 足浴报钟器哪个好 足浴按摩手法
  20. u盘插上去计算机没有,正常U盘插入电脑没反应?u盘插上没反应的绝对有效解决方法-太平洋电脑网...

热门文章

  1. https访问报证书错误_IE打开https网站时,提示此网站的安全证书有问题(证书无效)...
  2. 知识蒸馏首篇论文解读
  3. foc 电流环解耦_车用永磁同步电动机电流环偏差解耦控制系统
  4. FPGA采集AD7606全网最细讲解 提供串行和并行2套工程源码和技术支持
  5. nvidia 显卡驱动安装,以及解决驱动无法正确加载的问题
  6. Smartbi凭什么入选Gartner中国人工智能创业公司代表名单?
  7. 彻底卸载Revit并重新安装
  8. 2021年 春季Elasticsearch面试题附答案【一】
  9. MATLAB智能优化算法 - 粒子群算法及MATLAB实例仿真
  10. 出现socket:(10107)系统调用失败