当前位置: 首页 > news >正文

算法题之水壶问题

水壶问题

有两个水壶,容量分别为 x 和 y 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 target 升。

你可以:

  • 装满任意一个水壶
  • 清空任意一个水壶
  • 将水从一个水壶倒入另一个水壶,直到接水壶已满,或倒水壶已空。

示例 1: 

输入: x = 3,y = 5,target = 4
输出: true
解释:
按照以下步骤操作,以达到总共 4 升水:
1. 装满 5 升的水壶(0, 5)。
2. 把 5 升的水壶倒进 3 升的水壶,留下 2 升(3, 2)。
3. 倒空 3 升的水壶(0, 2)。
4. 把 2 升水从 5 升的水壶转移到 3 升的水壶(2, 0)。
5. 再次加满 5 升的水壶(2, 5)。
6. 从 5 升的水壶向 3 升的水壶倒水直到 3 升的水壶倒满。5 升的水壶里留下了 4 升水(3, 4)。
7. 倒空 3 升的水壶。现在,5 升的水壶里正好有 4 升水(0, 4)。
参考:来自著名的 "Die Hard"

示例 2:

输入: x = 2, y = 6, target = 5
输出: false

示例 3:

输入: x = 1, y = 2, target = 3
输出: true
解释:同时倒满两个水壶。现在两个水壶中水的总量等于 3。

提示:

  • 1 <= x, y, target <= 103

解题思路

想起了当年实习面试的时候,笔试题中有一道题目就是类似的,有两个水壶,一个3升,一个5升,问怎么才能获取4升水。当时思考了一下,然后把题目做出来了;不仅做出来,还画了一个如何操作的草图。时隔多年,还能想到当时做出题目高兴的样子,现在想想还是挺有趣的。

今天咱们来尝试用代码解出来。

最容易想到的办法,就是一直尝试,装满第一个水壶,然后倒到第二个水壶里,或者从第二个水壶里倒到第一个水壶里,利用两个壶相差的容量,尝试出最后的结果。

在这道题中,提供了两个水壶,也就是说往壶里倒水或者不倒水是可以穷举出来的,假设两个壶分别为X壶、Y壶,操作上有以下这几种情况:

  • 把X壶装满
  • 把Y壶装满
  • 把X壶倒空
  • 把Y壶倒空
  • 把X壶的水倒到Y壶里,直到X壶的水倒完了或者Y壶装满了
  • 把Y壶的水倒到X壶里,直到Y壶的水倒完了或者X壶装满了

如果上面几种操作都不满足,那么可以继续再来一轮操作,需要注意的是,这轮操作中,需要以上轮操作中,X壶和Y壶中剩余的水量开始操作,而不是直接以满壶或者空壶来操作。

如果没有找到满足的答案的情况,什么时候停止呢?

我们其实可以发现,第一轮的操作和后面的操作中,两个壶里剩下的水量可能会有相同的情况,那么出现的相同的水量的情况,就可以不用再重复操作了。所以我们需要用一个Set集合记录已经出现的情况,并且再下一次操作之前去除。当我们把所有情况都遍历完了,仍然没有找到符合的情况,那么就可以停止了,说明是不能获取到出目标水量的。

具体代码如下:

class Solution {public boolean canMeasureWater(int x, int y, int z) {Deque<int[]> stack = new LinkedList<int[]>();stack.push(new int[]{0, 0});Set<Long> seen = new HashSet<Long>();while (!stack.isEmpty()) {if (seen.contains(hash(stack.peek()))) {stack.pop();continue;}seen.add(hash(stack.peek()));int[] state = stack.pop();int remain_x = state[0], remain_y = state[1];if (remain_x == z || remain_y == z || remain_x + remain_y == z) {return true;}// 把 X 壶灌满。stack.push(new int[]{x, remain_y});// 把 Y 壶灌满。stack.push(new int[]{remain_x, y});// 把 X 壶倒空。stack.push(new int[]{0, remain_y});// 把 Y 壶倒空。stack.push(new int[]{remain_x, 0});// 把 X 壶的水灌进 Y 壶,直至灌满或倒空。stack.push(new int[]{remain_x - Math.min(remain_x, y - remain_y), remain_y + Math.min(remain_x, y - remain_y)});// 把 Y 壶的水灌进 X 壶,直至灌满或倒空。stack.push(new int[]{remain_x + Math.min(remain_y, x - remain_x), remain_y - Math.min(remain_y, x - remain_x)});}return false;}public long hash(int[] state) {return (long) state[0] * 1000001 + state[1];}
}

复杂度分析

  • 时间复杂度:O(xy),不同的情况最多可能有(x+1)(y+1)种,我们使用深度优先搜索,深度优先的复杂度是O(1),所以总的时间复杂度即O(xy)
  • 空间复杂度:O(xy),我们用了一个Stack栈和Set集合,其中Set集合中最多会放置(x+1)(y+1)种情况。

相关文章:

算法题之水壶问题

水壶问题 有两个水壶&#xff0c;容量分别为 x 和 y 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 target 升。 你可以&#xff1a; 装满任意一个水壶清空任意一个水壶将水从一个水壶倒入另一个水壶&#xff0c;直到接水壶已满&#xff0c;或倒水壶已空。 示…...

Java项目: 基于SpringBoot+mysql蜗牛兼职网兼职平台管理系统(含源码+数据库+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql蜗牛兼职网兼职平台管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操…...

C#数组中的Rank,GetUpperBound(), GetLength()

Rank-数组的秩&#xff0c;一维数组的Rank1&#xff1b;二维数组的Rank2&#xff1b; GetUpperBound()--获取每一维的索引的上限&#xff0c; 比如int[4,5], 那么GetUpperBound(0) 3; GetUpperBound(1) 4 ; 所以 对于二维数组来说 GetUpperBound(0)1行数&#xff1b; G…...

Android应用开发项目式教程——序

文章目录 Android技术本书特点本书内容本书参考 Android技术 Android是重要的客户端技术&#xff0c;因其开源开放的特点&#xff0c;Android在其初期就迅速成长为智能手机的主流操作系统&#xff0c;近年来更进一步成为智能电视、智能车载终端等智能设备的主流操作系统&#…...

【Spring Boot 3】【Web】统一处理 HTTP 请求体

【Spring Boot 3】【Web】统一处理 HTTP 请求体 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总…...

uni-app开发微信小程序

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;它允许开发者编写一次代码&#xff0c;然后发布到iOS、Android、Web&#xff08;包括各种小程序平台如微信小程序、支付宝小程序、百度智能小程序等&#xff09;以及各种快应用平台上。对于使用uni-app开发微信小…...

Qt开发框架--完整的软件开发框架

Qt开发框架包含一整套高度直观、模块化 的C 库类&#xff0c;并加载可简化应用程序开发的API。Qt 可生成高可读、易维护和可重用的代码&#xff0c;具有较高的运行时性能&#xff0c;且内存占用小。最重要的是&#xff0c;Qt是跨平台的。 Qt工具分为这么几个类别&#xff1a; …...

Python爬虫-Amazon亚马逊oData参数

前言 本文是该专栏的第37篇,后面会持续分享python爬虫干货知识,记得关注。 本文以“亚马逊Amazon”为例,主要获取亚马逊商品详情页的oData参数规律。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整…...

Q215 数组中第K大的元素

思路 可以用排序&#xff0c;但是不用全有序 还有个要求是O&#xff08;n&#xff09; 快排改版 快排只排需要的部分 public int findKthLargest(int[] nums, int k) {return quickSort(nums, 0, nums.length-1, nums.length-k);}public static int quickSort(int[] nums, …...

Java8特性:分组、提取字段、去重、过滤、差集、交集

总结下自己使用过的特性 将对象集合根据某个字段分组 //根据id分组 Map<String, List<Bean>> newMap successCf.stream().collect(Collectors.groupingBy(b -> b.getId().trim()));获取对象集合里面的某个字段的集合 List<Bean> list new ArrayList&l…...

Maven快速上手使用指南的笔记

Maven Mini Guides Configuring for Reproducible Builds 使用Maven实现重复构建。 检查当前使用的插件的版本。 mvn artifact:check-buildplan修改pom.xml&#xff0c;增加如下配置&#xff0c;显式指定project.build.outputTimestamp的取值&#xff1a; <properties>…...

MySQL面试题大全和详解,含SQL例子

若有不理解&#xff0c;可以问一下这几个免费的AI网站 https://ai-to.cn/chathttp://m6z.cn/6arKdNhttp://m6z.cn/6b1quhhttp://m6z.cn/6wVAQGhttp://m6z.cn/63vlPw 下面是一些常见的 MySQL 面试题及其解答&#xff0c;包含 SQL 示例。 1. 什么是 MySQL&#xff1f; 答&…...

java-redis-雪崩

Redis 雪崩问题 Redis雪崩 是指在 Redis 缓存系统中&#xff0c;当大量缓存同时失效时&#xff0c;所有请求直接打到数据库&#xff0c;导致数据库瞬间压力激增&#xff0c;甚至崩溃的现象。雪崩问题通常出现在高并发的系统中&#xff0c;因为缓存的失效导致后端数据库承受不了…...

如何在mac上玩使命召唤手游?苹果电脑好玩的第一人称射击游戏推荐

《使命召唤4&#xff1a;现代战争》&#xff08;Call of Duty 4: Modern Warfare&#xff09;是由Infinity Ward开发并于2007年发行的第一人称射击游戏。该游戏是《使命召唤》系列的第四部作品&#xff0c;是一款非常受欢迎的游戏之一&#xff0c;《使命召唤4&#xff1a;现代战…...

SimHash算法详解与应用

1. 简介 在当今信息爆炸的时代&#xff0c;如何有效地管理和处理海量的文本数据&#xff0c;尤其是去除重复内容&#xff0c;是一项重要的任务。SimHash 是一种巧妙的哈希算法&#xff0c;它不仅能快速生成文本的哈希值&#xff0c;还能在不同文本之间生成相似的哈希值&#x…...

RasberryPi 3B树莓派基本配置

RaspberryPi 3B树莓派基本配置 文章目录 RaspberryPi 3B树莓派基本配置一、准备工作1.1 硬件准备&#xff1a;1.1.1 树莓派和电源适配器&#xff1a;1.1.2 USB转TTL模块&#xff1a;1.1.3 读卡器和TF卡&#xff1a; 1.2 软件准备&#xff1a;1.2.1 下载 Raspberry Pi OS&#x…...

Docker编译环境的使用(ubuntu)

目录 Ubuntu安装docker 重启docker 拉取镜像 进入docker安装软件 提交docker 添加用户到docker组 进入docker 添加build用户 停止容器 保存docker镜像 load镜像 删除容器 Ubuntu安装docker sudo apt install docker.io 国内可用的源 Welcome to nginx! (tence…...

认知杂谈53

今天分享 有人说的一段争议性的话 I I 1.自助者天助 首先呢&#xff0c;咱得好好琢磨琢磨“自助者天助”这句话。这话说起来好像有点高深莫测的感觉&#xff0c;其实啊&#xff0c;道理特别简单。 就是说要是你自己都不乐意努力&#xff0c;那老天爷也不会平白无故地来帮你…...

量子计算信息安全威胁与应对策略分析

作者简介 赖俊森 中国信息通信研究院技术与标准研究所光网络技术与应用研究部主任工程师&#xff0c;正高级工程师&#xff0c;主要研究方向为量子信息、量子通信、量子计算等。 赵文玉 中国信息通信研究院技术与标准研究所副所长&#xff0c;正高级工程师&#xff0c;主要…...

Oracle(112)如何使用RMAN恢复数据库?

使用 RMAN&#xff08;Recovery Manager&#xff09;恢复 Oracle 数据库是确保数据在灾难情况下能够得到恢复的关键步骤。以下是详细的指导和代码示例&#xff0c;展示如何使用 RMAN 进行数据库恢复。 1. 准备工作 在开始恢复之前&#xff0c;需要确保以下几点&#xff1a; …...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...