题目

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. GitHub上的编程语言:JavaScript领衔Java次之
  2. STM32开发 -- Gerrit的详细使用
  3. 前端那些年--npm
  4. 网络知识:各种缓存核心知识整理,值得收藏!
  5. autohotkey编写windows脚本实现test.lab试验数据快速导出
  6. Java 并发编程之 ThreadLocal 线程局部变量
  7. Elasticsearch--Docker安装kibana---全文检索引擎ElasticSearch工作笔记003
  8. Mycat安全_监控平台简介---MyCat分布式数据库集群架构工作笔记0035
  9. docker容器网络通讯——外部访问内部
  10. cannot import name ‘Imputer‘ from ‘sklearn.preprocessing‘
  11. (29)Spring boot 文件上传(多文件上传)【从零开始学Spring Boot】
  12. Ruby中的concat()方法
  13. 统计学权威盘点过去50年最重要的统计学思想,因果推理、bootstrap等上榜,Judea Pearl点赞
  14. excel表格自动添加边框
  15. Unity3D 局部截图、全屏截图、带UI截图三种方法
  16. ACM教程 - (数论)正整数分解使得乘积最大问题
  17. 计算机的配件知识,最基本的入门知识:电脑由哪些部件组成?
  18. 文本输入框input实现字母大小写转换
  19. python从TXT导入两列数据绘图 直线多点等分坐标可视化
  20. html输入密码访问指定页面,三种方法使HTML单页面输入密码才能访问

热门文章

  1. XJOJ - 路径数(最短路+最短路路径数量)
  2. CodeForces - 1295E Permutation Separation(线段树+二维偏序,好题)
  3. CodeForces - 620E New Year Tree(线段树+dfs序+状态压缩)
  4. 广度优先遍历算法-01寻找制高点问题
  5. 深度优先遍历算法-03二叉树路径遍历问题
  6. Python配置-virtualenv和conda的区别
  7. MFC 界面美化 Skinmagic
  8. Shell脚本语言与编译型语言的差异
  9. 关于windows xp sp2/sp3 中tcpip.sys对于Raw socket的限制
  10. 基于WinDbg的内存泄漏分析