盛最多水的容器

Mw_Monster發表於2020-10-23

地址:https://leetcode-cn.com/problems/container-with-most-water/

題目:給你 n 個非負整數 a1,a2,…,an,每個數代表座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

說明:你不能傾斜容器,且 n 的值至少為 2。

在這裡插入圖片描述

圖中垂直線代表輸入陣列 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍色部分)的最大值為 49。

示例:

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

題解

解法一:暴力法

​ 兩層for迴圈,全部計算一遍,然後比較出最大值。

class Solution {
		public int maxArea(int[] height) {
				// 設定最大值為0
				int maxArea = 0;
				// 因為是兩層for迴圈,第一個值i取不到最後一個值
				for (int i = 0; i < height.length - 1; i++) {
						// j 的初始時為i + 1,因為當j < i時,會計算兩次,並且j可以取到最後一個值
						for (int j = i + 1; j < height.length; j++) {
								// 矩形底為座標差 = (j - i)
								// 矩形高為i和j對應的值的較小值
								int area = (j - i) * Math.min(height[i], height[j]);
								maxArea = Math.max(area, maxArea);
						}
				}
				return maxArea;
		}
}

題解二:雙指標

​ 一層for迴圈,第一個指標從0開始,第二個指標從末尾開始,計算出面積,然後向中間移動較小的指標,當兩個指標相同時,停止遍歷。

class Solution {
		public int maxArea(int[] height) {
				// 設定最大值為0
				int maxArea = 0;
				// 設定兩個指標
				int i = 0, j = height.length - 1;
				// 當第一個指標小於第二個指標時,進行遍歷
				while (i < j) {
						int area = (j - i) * Math.min(height[i], height[j]);
						maxArea = Math.max(area, maxArea);
						if (height[i] < height[j]) {
								i++;
						} else {
								j--;
						}
				}
				return maxArea;
		}
}

相關文章