题目

https://leetcode.com/problems/water-and-jug-problem/

又是踩比赞多的一道题…我认为有两个可能的原因:

  1. 虽然通过了,但原理不明了。
  2. 本质是个数学问题,数学问题本应用数学方法解决。如果用普通的模拟解法,会很耗(人的)时间。

题解

看了下面的 Related Topics,知道了这是个 DFS,就往 DFS 的方向思考了。

思路就是辗转相减,直到结果等于 target 为止。为了避免重复运算,将已经得到的结果放进 seen 集合中。

顺便贴一下草稿:

另外,本题实际上可以简化成为一个数学问题,参考:Math solution - Java solution

import java.util.HashSet;class Solution {public boolean canMeasureWater(int jug1Capacity, int jug2Capacity, int targetCapacity) {int c1, c2; // c1<c2if (jug1Capacity < jug2Capacity) {c1 = jug1Capacity;c2 = jug2Capacity;} else {c1 = jug2Capacity;c2 = jug1Capacity;}if (c1 == targetCapacity || c2 == targetCapacity || c1 + c2 == targetCapacity) return true;HashSet<Integer> seen = new HashSet<>();seen.add(c1);seen.add(c2);int dif = c2 - c1;while (dif > 0) {if (dfs(c1, c2, dif, targetCapacity, seen)) return true;dif -= c1;}return false;}public boolean dfs(int c1, int c2, int diff, int t, HashSet<Integer> seen) {if (seen.contains(diff)) return false;seen.add(diff);if (diff == t || c1 + diff == t || c2 + diff == t) return true;int d1 = c1 - diff;while (d1 > 0) {if (dfs(c1, c2, d1, t, seen)) return true;d1 -= diff;}int d2 = c2 - diff;while (d2 > 0) {if (dfs(c1, c2, d2, t, seen)) return true;d2 -= diff;}int d3 = c1 + diff;while (d3 < c2) {if (dfs(c1, c2, d3, t, seen)) return true;d3 += diff;}return false;}
}

leetcode 365. Water and Jug Problem | 365. 水壶问题(Java)相关推荐

  1. LeetCode | 0365. Water and Jug Problem水壶问题【Python】

    LeetCode 0365. Water and Jug Problem水壶问题[Medium][Python][BFS][数学] Problem LeetCode You are given two ...

  2. LeetCode Water and Jug Problem(巧妙转换为gcd问题)

    题意:给出x,y升水壶,问是否可以量出z升水.有三种操作:填满水壶,清空水壶. 从其中一个水壶倒入另一个水壶 代码如下: public class Solution {private int gcd( ...

  3. LeetCode-3.21-365-M-水壶问题(Water and Jug Problem)

    文章目录 思路-wait 解法 有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 ...

  4. 《LeetCode力扣练习》第461题 汉明距离 Java

    <LeetCode力扣练习>第461题 汉明距离 Java 一.资源 题目: 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目. 给你两个整数 x 和 y,计算并返回 ...

  5. 《LeetCode力扣练习》第46题 全排列 Java

    <LeetCode力扣练习>第46题 全排列 Java 一.资源 题目: 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 .你可以 按任意顺序 返回答案. 示例 1: 输 ...

  6. [LeetCode]124. 二叉树中的最大路径和(java实现)递归

    [LeetCode]124. 二叉树中的最大路径和(java实现)递归 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总 ...

  7. Office 365 系列三 ------ 创建Office 365普通账号

    当我们购买或者试用Office 365的时候,微软或者世纪互联会发一封邮件给我们,里面就只有管理员的账号,那么作为我们IT 管理员应该给员工创建账号, 创建的过程如下: 一.登陆: http://po ...

  8. Office 365:如何管理Office 365中的Ophaned Mailbox

    随着科技的迅速发展,很多大中型企业为了提高员工的工作效率,高效地完成业务流程,采用Office 365作为企业数据管理和人员沟通和交流的平台,以逐步摒弃了旧的办公模式,走向无纸质办公氛围.而当下,员工 ...

  9. 使用Office 365 试用账户 体验Office 365功能

    首先,需要申请Office 365 Enterprise E3版本的试用账户. 在浏览器中,输入以下地址,然后回车: http://products.office.com/en-us/business ...

最新文章

  1. 基于Shodan Python库的批量攻击实践 撒旦网
  2. OCP12C题库,71sql的使用
  3. 微信小程序验证车牌号(含新能源车牌)
  4. 【Python】青少年蓝桥杯_每日一题_11.19_围圈报数
  5. 网络克隆报a:\ghosterr.txt故障解决一例
  6. 电脑计算器_CPA考生注意!2020考场只允许带这种计算器
  7. JAVA table word,实战 | Java读取Word,包含表格!
  8. 挖掘城市ip_企鹅号助力城市品牌IP化进程
  9. python学来干什么-学 Python 都用来干嘛的?
  10. 用科学数据求真:月球的激光发射器有用吗?
  11. 用户自定义变量、系统变量、环境变量
  12. Java加密方式(AES,DES,RSA,DSA,MD5)
  13. 金蝶财务软件有哪些缺点
  14. 主流影视网站8合一H5视频源码自动更新数据
  15. 计算机应用基础word的课件,计算机应用基础之word2010课件
  16. 对称加密算法和非对称加密算法
  17. 仿照支付宝等——自动获取短信中的验证码
  18. 驿路梅花处处开 --- 梅语
  19. Consul小贴士-记一次Consul注册failing状态跟踪
  20. [200127] Java类初始化与实例初始化 - Thinking in Java学习日志

热门文章

  1. 数据分析与挖掘-python常用数据探索函数
  2. 5.IDA-文本搜索、二进制搜索(16进制字节序列)、替换16进制
  3. 网狐棋牌(六) DataBaseEngine 和 网狐棋牌(七) CEventService
  4. VC中操作INI文件的API
  5. Linux网络编程 | 事件处理模式:Reactor模式、Proactor模式
  6. C语言程序设计 | 扫雷游戏
  7. 这篇 CPU Cache,估计要消化一下
  8. 面试官:Spring为什么建议使用构造器来注入?
  9. 分布式锁(Redisson)-从零开始,深入理解与不断优化
  10. Game as a Service —— 开源云游戏搭载WebRTC