[LeetCode解题报告] 365. 水壶问题
[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
三、 本题小结
- 遇到这种问题不要慌直接搜索。
- 当搜索状态无限多的时候可以随手想一个上下边界。当然这题显然不是无限多,因此用vis即可。
[LeetCode解题报告] 365. 水壶问题相关推荐
- [LeetCode解题报告] LCP 48. 无限棋局
[LeetCode解题报告] LCP 48. 无限棋局 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. ...
- LeetCode解题报告汇总
LeetCode解题报告: [LeetCode]1.Two Sum - Yoona - 博客频道 - CSDN.NET [LeetCode]2.Add Two Numbers - Yoona - 博客 ...
- [LeetCode解题报告] 741. 摘樱桃
[LeetCode解题报告] 741. 摘樱桃 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. 题目描述 ...
- [LeetCode解题报告] LCP 49. 环形闯关游戏
[LeetCode解题报告] LCP 49. 环形闯关游戏 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 四. 参考链接 ...
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
- 【LeetCode解题报告】《算法基础006_日期算法》- Java
目录 一.一周中的第几天 1.题目 2.分析 3.代码 二.一年中的第几天 1.题目 2.分析 3.代码 三.日期之间隔几天 1.题目 2.分析 3.代码 一.一周中的第几天 1.题目 1185.一周 ...
- leetcode解题报告:188 Best Time to Buy and Sell Stock IV
问题: 给定一个列表,第i个元素代表股票第i天的价值,最多只允许买入卖出k次,求最大收益 思路:动态规划 输入为列表p1p2...pm 代码:Python 转载于:https://blog.51cto ...
- leetcode解题报告:198 House Robber
问题描述: 一个小偷去一个街区偷东西,求偷得价值最大,唯一限制就是不能偷连续的两家,因为这样会触发警报. 建模: 给定一个列表,里面存着每家可以偷的价值,输出最大偷到的价值. 思路:动态规划 如果输入 ...
- leetcode解题报告:Interleaving String
问题描述: 给定两个字符串s1, s2,判断字符串s3是否是由s1.s2交错构成. 例子: s1 = "aabcc", s2 = "dbbca", When s ...
最新文章
- js pug 代码_用JS写的windows95操作系统
- python中的栈结构_对Python列表进行封装和二次开发实现自定义栈结构
- 【HTTP】另类的POST头数据 RFC1867协议格式简析
- EF调用存储过程实现分页
- navicat循环执行上下两行相减sql语句_SQL语句的优化分析
- 初学echart的简单使用
- LeetCode 80. 删除排序数组中的重复项 II
- number输入框限制输入数字位数、字体随数字长度变化
- 利用SuppressMessage来阻止FxCop进行代码分析时报出的警告
- 学习设计模式 - 六大基本原则之开闭原则
- mysql开发要注意什么_Mysql日常开发注意要点
- STM32的备份寄存器和控制状态寄存器
- 软件工程之图书管理系统总体设计
- java60秒倒计时
- 贪心算法——国王游戏(洛谷P1080)
- lambda表达式写法
- 服务器内存怎么看型号,怎么查看服务器内存的型号
- 一场先进技术与先锋企业碰撞的知识盛宴!弘玑Cyclone『超级自动化的数字内生力量』CXO私享会成功举办
- 足浴报钟器哪个好 足浴按摩手法
- u盘插上去计算机没有,正常U盘插入电脑没反应?u盘插上没反应的绝对有效解决方法-太平洋电脑网...
热门文章
- https访问报证书错误_IE打开https网站时,提示此网站的安全证书有问题(证书无效)...
- 知识蒸馏首篇论文解读
- foc 电流环解耦_车用永磁同步电动机电流环偏差解耦控制系统
- FPGA采集AD7606全网最细讲解 提供串行和并行2套工程源码和技术支持
- nvidia 显卡驱动安装,以及解决驱动无法正确加载的问题
- Smartbi凭什么入选Gartner中国人工智能创业公司代表名单?
- 彻底卸载Revit并重新安装
- 2021年 春季Elasticsearch面试题附答案【一】
- MATLAB智能优化算法 - 粒子群算法及MATLAB实例仿真
- 出现socket:(10107)系统调用失败