快轉到主要內容
leetcode 11 - Container With Most Water

leetcode 11 - Container With Most Water

·
類別 
Leetcode
標籤 
Java Leetcode Medium Two Pointers Problem Blind75
Eason Chiu
作者
Eason Chiu
一個不做筆記就容易忘記的工程師
目錄

題目
#

leetcode 11 - Container With Most Water (題目說明請點連結)

題目簡述
#

給定一個表示容器高度的陣列,找出兩個高度線與x軸圍成的容器能盛裝的最大水量。

Container With Most Water

Example 1:

Input: height = [1,8,6,2,5,4,8,3,7]
Output: 49
Explanation: 最大面積是通過選擇 height[1] = 8 和 height[8] = 7 得到的。面積 = 8 × 7 = 49。

Example 2:

Input: height = [1,1]
Output: 1
Explanation: 最大面積是通過選擇 height[0] = 1 和 height[1] = 1 得到的。面積 = 1 × 1 = 1。

解題思路
#

問題理解
#

給定一個表示容器高度的陣列,找出兩個高度線與x軸圍成的容器能盛裝的最大水量。
容器的面積 = 寬度 × 高度,其中:

  • 寬度 = 兩個指針之間的距離
  • 高度 = 兩個指針指向的較小值(因為水會從較低的一側溢出)

使用 Two Pointers,從陣列兩端開始向中間移動:

  • 左指針 left 從陣列開頭開始
  • 右指針 right 從陣列結尾開始
  • 每次移動較小高度的指針(因為較小高度限制了容器的最大可能面積)
Container With Most Water
  1. 初始化左右指針和最大面積
  2. 計算當前面積:(right - left) × min(height[left], height[right])
  3. 比較左右指針的高度:
    • 如果 height[left] < height[right]:移動左指針
    • 如果 height[left] >= height[right]:移動右指針
  4. 更新最大面積
  5. 重複步驟2-4直到指針相遇

完整程式碼
#

java
class Solution {
    public int maxArea(int[] height) {
        int left = 0; // 初始化左指針
        int right = height.length - 1; // 初始化右指針
        int maxArea = 0; // 初始化最大面積
        
        while (left < right) { // 當左右指針未相遇時繼續
            int area = (right - left) * Math.min(height[left], height[right]); // 計算當前面積
            
            if (height[left] > height[right]) { // 如果左側高度大於右側
                right--; // 移動右指針
            } else { // 如果右側高度大於等於左側
                left++; // 移動左指針
            }
            
            if (area > maxArea) { // 如果當前面積大於最大面積
                maxArea = area; // 更新最大面積
            }
        }
        
        return maxArea; // 返回最大面積
    }
}

時間複雜度
#

  • 時間複雜度:O(n),其中 n 是數組的長度
  • 空間複雜度:O(1),只使用了常數額外空間

相關文章

leetcode 15 - 3Sum
類別 
Leetcode
標籤 
Java Leetcode Medium Two Pointers Problem Blind75
leetcode 80 - Remove Duplicates from Sorted Array II
類別 
Leetcode
標籤 
Java Leetcode Medium Two Pointers Problem
leetcode 1047 - Remove All Adjacent Duplicates In String
類別 
Leetcode
標籤 
Java Leetcode Easy Two Pointers Problem