Swift 解法詳解 LeetCode 365:水壺問題

在這里插入圖片描述
在這里插入圖片描述

文章目錄

    • 摘要
    • 描述
    • 題解答案
    • 題解代碼分析
      • 代碼拆解
    • 示例測試及結果
    • 時間復雜度
    • 空間復雜度
    • 總結

摘要

這道題其實就是經典的 “兩個水壺問題”,你可能在電影《虎膽龍威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…