LeetCode 37.水壶问题 数学方法与广度遍历
时间:2020-03-26
本文章向大家介绍LeetCode 37.水壶问题 数学方法与广度遍历,主要包括LeetCode 37.水壶问题 数学方法与广度遍历使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?
如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。
你允许:
- 装满任意一个水壶
- 清空任意一个水壶
- 从一个水壶向另外一个水壶倒水,直到装满或者倒空
示例 1: (From the famous "Die Hard" example)
输入: x = 3, y = 5, z = 4
输出: True
示例 2:
输入: x = 2, y = 6, z = 5
输出: False
解题思路
数学方法:找到x,y的最大公约数能否z被整除
BFS:将水壶x,y的相关操作分解为6个状态,分别为 // 1.给x装满水 // 2.给y装满水 // 3.清空x的水 // 4.清空y的水 // 5.x向y倒水,直到x空或者y满 // 6.y向x倒水,直到y空或者x满 // 通过不断的搜索,如果x,y中的水满足 // x == z || y == z || x + y == z 返回true,否则继续搜索直到所有情况都搜索完毕
代码如下
数学方法:
public boolean canMeasureWater(int x, int y, int z) {
if(x+y<z){
return false;
}
if(x == 0 || y == 0){
return z==0 || x+y==z;
}
return z % gcb(x,y) == 0;
}
int gcb(int m, int n) {
if (m < n) {// 保证m>n,若m<n,则进行数据交换
int temp = m;
m = n;
n = temp;
}
if (m % n == 0) {// 若余数为0,返回最大公约数
return n;
} else { // 否则,进行递归,把n赋给m,把余数赋给n
return gcb(n, m % n);
}
}
BFS:
public boolean canMeasureWater(int x, int y, int z) { if (z > x + y) return false; if (x == z || y == z || x + y == z) return true; // 保存搜索过的情况,防止无止境的搜索下去 Set<List<Integer>> set = new HashSet<>(); // 保存每次操作后,x,y中剩余的水的容量 LinkedList<List<Integer>> res = new LinkedList<>(); // 初始时,x y中均没有水 List<Integer> list = Arrays.asList(0, 0); set.add(list); res.add(list); while (!res.isEmpty()) { List<Integer> poll = res.poll(); int remain_x = poll.get(0); int remain_y = poll.get(1); if (remain_x == z || remain_y == z || remain_x + remain_y == z) { return true; } // 给x加满水 List<Integer> p1 = Arrays.asList(x, remain_y); if (!set.contains(p1)) { set.add(p1); res.add(p1); } // 给y加满水 List<Integer> p2 = Arrays.asList(remain_x, y); if (!set.contains(p2)) { set.add(p2); res.add(p2); } // 清空x的水 List<Integer> p3 = Arrays.asList(0, remain_y); if (!set.contains(p3)) { set.add(p3); res.add(p3); } // 清空y的水 List<Integer> p4 = Arrays.asList(remain_x, 0); if (!set.contains(p4)) { set.add(p4); res.add(p4); } // x向y倒水 int tmp_x = (remain_x + remain_y) <= y ? 0 : remain_x + remain_y - y; int tmp_y = (remain_x + remain_y) < y ? remain_x + remain_y : y; List<Integer> p5 = Arrays.asList(tmp_x, tmp_y); if (!set.contains(p5)) { set.add(p5); res.add(p5); } // y向x倒水 tmp_y = (remain_x + remain_y) <= x ? 0 : remain_x + remain_y - x; tmp_x = (remain_x + remain_y) < x ? remain_x + remain_y : x; List<Integer> p6 = Arrays.asList(tmp_x, tmp_y); if (!set.contains(p6)) { set.add(p6); res.add(p6); } } return false; }
参考自:LeetCode用户yw-git
原文地址:https://www.cnblogs.com/Transkai/p/12574316.html
- numpy 参数(一) —— np.linalg
- 关于查看dba_data_files的一个小问题(r7笔记第72天)
- 一则备库CPU报警的思考(r7笔记第69天)
- Java设计模式-观察者模式
- 今天处理的三个小问题——20160120(r7笔记第84天)
- 主备切换的准备工作(r7笔记第83天)
- Java设计模式-外观模式
- Java设计模式-组合模式
- 使用shell批量监控磁盘坏块(二) (r7笔记第80天)
- JavaWeb10-request&response你不得不学(1)
- dg的奇怪问题终结和分区问题答疑 (r7笔记第77天)
- 最近让我焦灼的四个问题(有解) (r7笔记第76天)
- JavaWeb10-reques;response你不得不学(2)
- 很多人比较纠结的约束和索引的关系(r7笔记第75天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 快速学习-Jenkins CLI QuickStart
- 快速学习-Jenkins CLI用户
- 快速学习-Jenkins CLI诊断
- 快速学习-Jenkins CLI下载
- vue-element-admin提交表单数据到后端
- JDK15正式发布,划时代的ZGC同时宣布转正
- Redis的各种数据类型实践---List结构
- Git分支操作方法
- 最全解密微信红包随机算法(含代码实现)
- 两次死锁的分析
- 一次解决你的图像尺寸和定位问题。
- vuedraggable实现列表拖动排序
- 在 Xcode 中添加 Swift package 依赖
- 浅谈JavaScript中的apply,call和bind
- Git 的简单使用