在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 代码拆解
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

这道题其实就是经典的 “两个水壶问题”,你可能在电影《虎胆龙威3》里见过,布鲁斯·威利斯用两个水壶精确量出 4 升水来解除炸弹。这题就是把那个场景搬到了编程世界里。

我们的目标是:给定两个水壶的容量,看看能不能通过倒水、装满、倒空等操作,刚好得到指定的 target 升水。

描述

题目设定:

  • 有两个水壶,容量分别是 xy 升。

  • 水无限供应。

  • 操作允许:

    1. 把任意一个水壶装满
    2. 把任意一个水壶清空
    3. 把一个水壶里的水倒进另一个水壶,直到前者空或者后者满

问题:能不能正好量出 target 升?

示例 1

输入: x = 3, y = 5, target = 4
输出: true

示例 2

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

示例 3

输入: x = 1, y = 2, target = 3
输出: true

题解答案

其实解法有两个方向:

  1. 数学解法(最大公约数 GCD)

    • 经典定理:只要 target <= x + y,并且 targetgcd(x, y) 的倍数,就能得到。
    • 这就是数论里的贝祖定理。
    • 这个方法非常简洁高效。
  2. 模拟解法(BFS/DFS 搜索所有可能的状态)

    • 模拟真实倒水过程,尝试所有可能的壶水量组合,看是否能达到 target
    • 更直观,但效率会差一些。

我这里用 Swift 先写 数学解法,然后再在分析里扩展到模拟解法。

题解代码分析

下面是 Swift 的数学解法代码:

import Foundationclass Solution {func canMeasureWater(_ x: Int, _ y: Int, _ target: Int) -> Bool {// 如果目标超过两个水壶加起来的容量,直接不可能if target > x + y {return false}// 如果刚好等于总容量,也行if target == x + y {return true}// 如果目标是 0 也 trivially 成立if target == 0 {return true}// 使用最大公约数判断return target % gcd(x, y) == 0}// 求最大公约数(辗转相除法)private func gcd(_ a: Int, _ b: Int) -> Int {if b == 0 { return a }return gcd(b, a % b)}
}// MARK: - Demo 演示
let solution = Solution()print("示例1: \(solution.canMeasureWater(3, 5, 4))") // true
print("示例2: \(solution.canMeasureWater(2, 6, 5))") // false
print("示例3: \(solution.canMeasureWater(1, 2, 3))") // true

代码拆解

  1. 判断边界情况

    • 如果 target 比两个壶加起来还大,那不可能。
    • 如果 target 等于总容量,那就直接可以倒满。
    • 如果 target = 0,也 trivially 成立。
  2. 用最大公约数 GCD 判断

    • 数学原理是:能倒出的水量一定是 gcd(x, y) 的倍数。
    • 所以只要 target % gcd(x, y) == 0,就能实现。
  3. Demo 测试
    三个示例跑完结果都正确。

示例测试及结果

运行结果:

示例1: true
示例2: false
示例3: true

再自己加几个测试:

print(solution.canMeasureWater(6, 10, 8)) // true,因为 gcd(6,10)=2,8是2的倍数
print(solution.canMeasureWater(6, 10, 7)) // false,因为 gcd=2,7不是倍数
print(solution.canMeasureWater(4, 4, 8))  // true,两个壶一起装满就行

时间复杂度

  • 主要就是求一次最大公约数,时间复杂度 O(log(min(x, y)))
  • 非常快。

空间复杂度

  • 除了递归栈,几乎没有额外空间,复杂度是 O(1)

总结

这题其实一眼看上去像 BFS/DFS 的模拟搜索题,但背后藏着一个非常优雅的数学结论。
核心公式就是:target % gcd(x, y) == 0target <= x + y

在实际生活中,这种场景也经常遇到,比如:

  • 你有两个量杯,要量出指定的水。
  • 工厂配料时,用不同规格的容器去配比原料。
  • 甚至调酒的时候,也能用这个方法。

如果你喜欢更直观的解法,也可以用 BFS 来写,把 (a, b) 表示当前两个壶的状态,然后不断倒水直到找到目标。这个解法更贴近真实操作,但效率会差一些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97133.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97133.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/97133.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis集群介绍——主从、哨兵、集群

Redis集群介绍 集群里有三大模式&#xff1a; Redis主从模式&#xff1a;一主一从或一主多从&#xff0c;自带读写分离&#xff0c;负载均衡&#xff1b; Redis哨兵模式&#xff1a;高可用&#xff0c;主服务器宕机&#xff0c;从服务器变为主服务器&#xff1b; Redis集群…

【大前端】封装一个React Native与Android/IOS 端通用的埋点接口

RN 层只暴露一个统一的埋点方法&#xff0c;例如 trackEvent(eventName, params)&#xff0c;内部通过 NativeModule 调用 Android/iOS 的原生埋点 SDK。这样 RN 层不用关心具体实现。写一个通用的示例&#xff1a;1. RN 层封装统一接口&#xff08;JS 代码&#xff09;// anal…

详解 外部负载均衡器 → Ingress Controller Pod 这个过程

在常见的生产架构中&#xff1a; 外部负载均衡器&#xff08;Ng/ELB/ALB/NLB等&#xff09;终止来自客户端的 HTTPS 连接。 它将解密后的明文 HTTP 请求转发给后端的 Kubernetes Ingress Controller Pods。 Ingress Controller 处理 HTTP 请求&#xff0c;并将 HTTP 响应返回给…

Markdown 编辑器 语法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

【PyTorch项目实战】SAM(Segment Anything Model) —— 致力于建立第一个图像分割基础模型

文章目录一、SAM&#xff08;Segment Anything Model&#xff09; —— 致力于建立第一个图像分割基础模型&#xff08;Foundation Model&#xff09;1、项目背景2、核心任务设计3、模型架构&#xff1a;图像编码器 提示编码器 掩码解码器4、核心创新&#xff1a;可提示分割任…

第一次实习总结

开发模式的转变现在虽然不怎么使用很传统的软件开发模型了&#xff0c;但是好歹也要敏捷开发吧。事实上&#xff0c;我这个小厂甚至做的更绝。全程无UML。。。需要一天&#xff1a;1.项目组长与客户进行需求对接。2.项目组长然后就找我来讲述需求&#xff0c;我就直接制作出原型…

创建uniApp小程序项目vue3+ts+uniapp

vscode创建pnpm i -D types/wechat-miniprogram uni-helper/uni-app-types{"compilerOptions": {"types": ["dcloudio/types","types/wechat-miniprogram","uni-helper/uni-app-types"] },"vueCompilerOptions": …

GitHub 热榜项目 - 日榜(2025-08-28)

GitHub 热榜项目 - 日榜(2025-08-28) 生成于&#xff1a;2025-08-28 统计摘要 共发现热门项目&#xff1a;13 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热门项目凸显三大技术趋势&#xff1a;1) AI领域持续爆发&#xff0c;涵盖大模型系统提示研究(asgeirt…

IPV6

本节课要掌握的知识点&#xff08;学习目标&#xff09; 概括IPv6相较于IPv4的优势 (Why IPv6?) 描述IPv6的基本概念 描述IPv6报文头部的格式和原理 描述IPv6地址格式和地址类型 描述IPv6地址配置的方法和基本过程 执行IPv6地址以及IPv6静态路由的简单配置 一、IPV6 基础…

零基础开发应用:cpolar+Appsmith平民化方案

文章目录前言1.什么是Appsmith2.Docker部署3.Appsmith简单使用4.安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结前言 你是否也曾想搭建一个属于自己的应用&#xff0c;却被复杂的编程知识吓退&#xff1f;或者&#xff0c;想快速开发一个小工具解决工作难题&#…

【Ruoyi 解密 - 08. 前端探秘1】------ 从“交互原理”到“开发逻辑”,后端也能看懂的前端实战指南

Ruoyi-Vue3 核心知识点串讲&#xff1a;从“交互原理”到“开发逻辑”&#xff0c;后端也能看懂的前端实战指南 对于非前端工程师而言&#xff0c;学习 Ruoyi-Vue3 并非要成为专业前端开发者&#xff0c;而是要掌握“前后端交互逻辑”——搞懂数据如何从后端接口流转到前端页面…

Java SpringBoot+Mybatis-Flex+Logback实现打印日志

先看效果2025-08-26 09:52:19.834 [http-nio-10003-exec-10] INFO c.x.c.logging.RequestLoggingFilter - HTTP请求: {headers{content-length213, host192.168.31.149:10003, content-typeapplication/json, connectionkeep-alive, accept-encodinggzip, deflate, br, user-a…

SegEarth-R1: Geospatial Pixel Reasoning via Large Language Model

摘要 遥感技术已成为理解环境动态、城市规划和灾害管理的关键。然而,传统的遥感工作流程通常依赖显式分割或检测方法,这些方法难以处理需要对空间上下文、领域知识和隐含用户意图进行推理的复杂隐式查询。受此启发,我们提出了一项新任务——地理空间像素推理,该任务允许隐…

CRMEB标准版PHP移动应用微信开放配置及商城后台配置教程(附步骤)

APP配置内容主要围绕微信开放平台里的移动应用来配置;开发平台地址为:https://open.weixin.qq.com/ 1. 登录开发平台创建【移动应用】点击创建移动应用 2. 进入创建页面后根据页面提示填写对应信息 在是否上架的地方可以先选择否&#xff1b; 3.填写平台信息 根据自身需求勾选…

jQuery 从入门到实践:基础语法、事件与元素操作全解析

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 ​编辑 ⛅️定义 &#x1f353;引入依赖 ​编辑⛅️语法 &#x1f351;基础语法 &#x1f351;选择器 &#x1f351;jQuery事件 ⛅️操作 &#x1f350;添加操作…

野火STM32Modbus主机读取寄存器/线圈失败(二)-解决CRC校验错误

文章目录前情提要问题背景CRC校验失败问题现象原始问题数据问题分析1. CRC校验算法验证2. 手动计算验证问题解决思路问题解决根本原因解决方式1解决方式2重新编译测试前情提要 在自己的开发板上移植了野火的modbus主机程序并尝试使用。 问题背景 我使用STM32显示板作为Modbu…

从协作机器人到智能协作机器人:工业革命的下一跳

从协作机器人到智能协作机器人&#xff1a;工业革命的下一跳 文章目录从协作机器人到智能协作机器人&#xff1a;工业革命的下一跳摘要1️⃣ 协作机器人&#xff08;Cobot&#xff09;&#xff1a;工业柔性化的催化剂核心特点典型应用2️⃣ 智能机器人&#xff1a;赋予机器“思…

49个Docker自动化脚本:覆盖全场景运维,构建高可用容器体系

一、容器生命周期管理&#xff08;1-25&#xff09;&#xff1a;从创建到自愈的全流程自动化 1. 自动化容器创建脚本&#xff08;可复用配置&#xff09; 适用场景&#xff1a;快速创建标准化容器&#xff08;如Nginx、Redis&#xff09;&#xff0c;无需重复编写docker run命令…

Linux(二) | 文件基本属性与链接扩展

个人主页-爱因斯晨 文章专栏-Linux 最近学习人工智能时遇到一个好用的网站分享给大家&#xff1a; 人工智能学习 文件属性 看懂文件属性 在Linux中我们可以使用ll或者ls-l命令来显示一个文件的属性以及文件所属的用户和组。如&#xff1a; rootVM-24-17-ubuntu:~# cd / rootV…

MaxCompute MaxFrame | 分布式Python计算服务MaxFrame(完整操作版)

MaxCompute MaxFrame评测 | 分布式Python计算服务MaxFrame&#xff08;完整操作版&#xff09;前言MaxCompute MaxFrame服务开通开通 MaxCompute 服务开通 DataWorks 服务资源准备创建 DataWorks 工作空间创建 MaxCompute 项目创建MaxCompute数据源绑定数据源或集群创建MaxComp…