每日算法 -【Swift 算法】盛最多水的容器

盛最多水的容器:Swift 解法與思路分析

📌 問題描述

給定一個長度為 n 的整數數組 height,每個元素表示在橫坐標 i 處的一條垂直線段的高度。任意兩條線段和 x 軸構成一個容器,該容器可以裝水,水量的大小由較短的那條線段和兩線之間的距離決定。

請你找出其中能夠容納最多水的兩條線,并返回它們之間形成容器所能容納的最大水量。

示例:

輸入: height = [1,8,6,2,5,4,8,3,7]
輸出: 49

容器的兩條邊是第 2 條線(高度為 8)和第 9 條線(高度為 7),它們之間的距離是 7,所以最大面積是 min(8,7) * (8 - 1) = 7 * 7 = 49


🐢 暴力解法(僅供參考)

在講雙指針之前,我們也可以從最樸素的方式思考問題:枚舉所有可能的兩條線段,計算它們之間可以裝多少水,最后取最大值。

這種方式雖然思路直觀,但時間復雜度為 O(n^2),在數據量大時效率很低。

Swift 實現:

func maxAreaBruteForce(_ height: [Int]) -> Int {var maxArea = 0let n = height.countfor i in 0..<n {for j in i+1..<n {let h = min(height[i], height[j])let w = j - ilet area = h * wmaxArea = max(maxArea, area)}}return maxArea
}

雖然簡單,但這種方法會超時,不推薦在面試中使用,適合用于驗證答案或學習過程中的參考實現


💡 解題思路

這是一個典型的雙指針問題。

我們可以從數組的兩端開始,使用兩個指針分別指向最左和最右的線段。每次計算它們之間的容器所能容納的水量,然后移動其中較短的一側。

移動較短的一側的原因是:水的高度是由較短的那條線決定的,移動較長的一側不會獲得更大的容積,但移動較短的一側可能會找到一條更高的線,從而提升水量。

步驟如下:

  1. 初始化兩個指針 left = 0right = height.count - 1
  2. 計算當前的水量:min(height[left], height[right]) * (right - left)
  3. 更新最大水量。
  4. 移動較短邊的指針(如果左邊短,則 left += 1,否則 right -= 1)。
  5. 重復上述步驟,直到兩個指針相遇。

💻 Swift 代碼實現

func maxArea(_ height: [Int]) -> Int {var left = 0var right = height.count - 1var maxArea = 0while left < right {let h = min(height[left], height[right])let w = right - leftlet area = h * wmaxArea = max(maxArea, area)// 移動較短的那一側if height[left] < height[right] {left += 1} else {right -= 1}}return maxArea
}

📊 時間與空間復雜度分析

  • 時間復雜度:O(n)
    每個指針最多走一次,所以是線性時間復雜度。

  • 空間復雜度:O(1)
    只使用了常數級別的額外變量。


? 優化建議

這個解法已經是最優解法之一。如果你嘗試使用兩層 for 循環暴力解法,時間復雜度將會是 O(n^2),在輸入規模較大時效率非常低。而雙指針方法能夠在線性時間內求解,是在面試中非常推薦的策略。


🧪 測試一下

let test = [1,8,6,2,5,4,8,3,7]
let result = maxArea(test)
print("最大水量是:\\(result)")  // 輸出 49

🏁 總結

  • 本題的核心在于意識到兩條邊之間的水量只與短邊有關,因此采用雙指針、移動短邊是一種非常聰明且高效的方式。
  • 這是 LeetCode 中非常經典的一道題,也能很好地鍛煉你的思維方式是否具備“從整體最優轉向局部策略”的能力。

如果你喜歡這樣的算法題解風格,歡迎點贊、評論或者關注我一起交流 Swift、算法與面試技巧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908062.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908062.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908062.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云原生安全基礎:Linux 文件權限管理詳解

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 在云原生環境中&#xff0c;Linux 文件權限管理是保障系統安全的核心技能之一。無論是容器化應用、微服務架構還是基礎設施即代碼&#xff08;IaC&#xf…

TypeScript 中的字面量類型(Literal Types)

在 TypeScript 中&#xff0c;字面量類型&#xff08;Literal Types&#xff09;是一種特殊的類型&#xff0c;它允許你將變量的類型限制為某個具體的值&#xff08;如特定的字符串、數字或布爾值&#xff09;&#xff0c;而不僅僅是寬泛的類型&#xff08;如 string、number&a…

晶臺光耦在手機PD快充上的應用

光耦&#xff08;光電隔離器&#xff09;作為關鍵電子元件&#xff0c;在手機PD快充中扮演信號隔離與傳輸的“安全衛士”。其通過光信號實現電氣隔離&#xff0c;保護手機電路免受高電壓損害&#xff0c;同時支持實時信號反饋&#xff0c;優化充電效率。 晶臺品牌推出KL817、KL…

python學習打卡day43

DAY 43 復習日 作業&#xff1a; kaggle找到一個圖像數據集&#xff0c;用cnn網絡進行訓練并且用grad-cam做可視化 浙大疏錦行 數據集使用貓狗數據集&#xff0c;訓練集中包含貓圖像4000張、狗圖像4005張。測試集包含貓圖像1012張&#xff0c;狗圖像1013張。以下是數據集的下…

大數據與數據分析【數據分析全棧攻略:爬蟲+處理+可視化+報告】

- 第 100 篇 - Date: 2025 - 05 - 25 Author: 鄭龍浩/仟墨 大數據與數據分析 文章目錄 大數據與數據分析一 大數據是什么&#xff1f;1 定義2 大數據的來源3 大數據4個方面的典型特征&#xff08;4V&#xff09;4 大數據的應用領域5 數據分析工具6 數據是五種生產要素之一 二 …

uniapp 開發企業微信小程序,如何區別生產環境和測試環境?來處理不同的服務請求

在 uniapp 開發企業微信小程序時&#xff0c;區分生產環境和測試環境是常見需求。以下是幾種可靠的方法&#xff0c;幫助你根據環境處理不同的服務請求&#xff1a; 一、通過條件編譯區分&#xff08;推薦&#xff09; 使用 uniapp 的 條件編譯 語法&#xff0c;在代碼中標記…

青少年編程與數學 02-020 C#程序設計基礎 15課題、異常處理

青少年編程與數學 02-020 C#程序設計基礎 15課題、異常處理 一、異常1. 異常的分類2. 異常的作用小結 二、異常處理1. 異常處理的定義2. 異常處理的主要組成部分3. 異常處理的作用小結 三、C#異常處理1. 異常的基本概念2. 異常處理的關鍵字3. 異常處理的流程4. 自定義異常5. 異…

云原生時代 Kafka 深度實踐:05性能調優與場景實戰

5.1 性能調優全攻略 Producer調優 批量發送與延遲發送 通過調整batch.size和linger.ms參數提升吞吐量&#xff1a; props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384); // 默認16KB props.put(ProducerConfig.LINGER_MS_CONFIG, 10); // 等待10ms以積累更多消息ba…

在 Dify 項目中的 Celery:異步任務的實現與集成

Celery 是一個強大而靈活的分布式任務隊列系統&#xff0c;旨在幫助應用程序在后臺異步運行耗時的任務&#xff0c;提高系統的響應速度和性能。在 Dify 項目中&#xff0c;Celery 被廣泛用于處理異步任務和定時任務&#xff0c;并與其他工具&#xff08;如 Sentry、OpenTelemet…

Pytorch Geometric官方例程pytorch_geometric/examples/link_pred.py環境安裝教程及圖數據集制作

最近需要訓練圖卷積神經網絡&#xff08;Graph Convolution Neural Network, GCNN&#xff09;&#xff0c;在配置GCNN環境上總結了一些經驗。 我覺得對于初學者而言&#xff0c;圖神經網絡的訓練會有2個難點&#xff1a; ①環境配置 ②數據集制作 一、環境配置 我最初光想…

2025年微信小程序開發:AR/VR與電商的最新案例

引言 微信小程序自2017年推出以來&#xff0c;已成為中國移動互聯網生態的核心組成部分。根據最新數據&#xff0c;截至2025年&#xff0c;微信小程序的日活躍用戶超過4.5億&#xff0c;總數超過430萬&#xff0c;覆蓋電商、社交、線下服務等多個領域&#xff08;WeChat Mini …

互聯網向左,區塊鏈向右

2008年&#xff0c;中本聰首次提出了比特幣的設想&#xff0c;這打開了去中心化的大門。 比特幣白皮書清晰的描述了去中心化支付的解決方案&#xff0c;并分別從以下幾個方面闡述了他的理念&#xff1a; 一、由轉賬雙方點對點的通訊&#xff0c;而不通過中心化的第三方&#xf…

PV操作的C++代碼示例講解

文章目錄 一、PV操作基本概念&#xff08;一&#xff09;信號量&#xff08;二&#xff09;P操作&#xff08;三&#xff09;V操作 二、PV操作的意義三、C中實現PV操作的方法&#xff08;一&#xff09;使用信號量實現PV操作代碼解釋&#xff1a; &#xff08;二&#xff09;使…

《對象創建的秘密:Java 內存布局、逃逸分析與 TLAB 優化詳解》

大家好呀&#xff01;今天我們來聊聊Java世界里那些"看不見摸不著"但又超級重要的東西——對象在內存里是怎么"住"的&#xff0c;以及JVM這個"超級管家"是怎么幫我們優化管理的。放心&#xff0c;我會用最接地氣的方式講解&#xff0c;保證連小學…

簡單實現Ajax基礎應用

Ajax不是一種技術&#xff0c;而是一個編程概念。HTML 和 CSS 可以組合使用來標記和設置信息樣式。JavaScript 可以修改網頁以動態顯示&#xff0c;并允許用戶與新信息進行交互。內置的 XMLHttpRequest 對象用于在網頁上執行 Ajax&#xff0c;允許網站將內容加載到屏幕上而無需…

詳解開漏輸出和推挽輸出

開漏輸出和推挽輸出 以上是 GPIO 配置為輸出時的內部示意圖&#xff0c;我們要關注的其實就是這兩個 MOS 管的開關狀態&#xff0c;可以組合出四種狀態&#xff1a; 兩個 MOS 管都關閉時&#xff0c;輸出處于一個浮空狀態&#xff0c;此時他對其他點的電阻是無窮大的&#xff…

Matlab實現LSTM-SVM回歸預測,作者:機器學習之心

Matlab實現LSTM-SVM回歸預測&#xff0c;作者&#xff1a;機器學習之心 目錄 Matlab實現LSTM-SVM回歸預測&#xff0c;作者&#xff1a;機器學習之心效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 代碼主要功能 該代碼實現了一個LSTM-SVM回歸預測模型&#xff0c;核心流…

Leetcode - 周賽 452

目錄 一&#xff0c;3566. 等積子集的劃分方案二&#xff0c;3567. 子矩陣的最小絕對差三&#xff0c;3568. 清理教室的最少移動四&#xff0c;3569. 分割數組后不同質數的最大數目 一&#xff0c;3566. 等積子集的劃分方案 題目列表 本題有兩種做法&#xff0c;dfs 選或不選…

【FAQ】HarmonyOS SDK 閉源開放能力 —Account Kit(5)

1.問題描述&#xff1a; 集成華為一鍵登錄的LoginWithHuaweiIDButton&#xff0c; 但是Button默認名字叫 “華為賬號一鍵登錄”&#xff0c;太長無法顯示&#xff0c;能否簡寫成“一鍵登錄”與其他端一致&#xff1f; 解決方案&#xff1a; 問題分兩個場景&#xff1a; 一、…

Asp.Net Core SignalR的分布式部署

文章目錄 前言一、核心二、解決方案架構三、實現方案1.使用 Azure SignalR Service2.Redis Backplane(Redis 背板方案&#xff09;3.負載均衡配置粘性會話要求無粘性會話方案&#xff08;僅WebSockets&#xff09;完整部署示例&#xff08;Redis Docker&#xff09;性能優化技…