1. 程式人生 > >【LeetCode】11. 盛最多水的容器

【LeetCode】11. 盛最多水的容器

題目連結https://leetcode-cn.com/problems/container-with-most-water/description/

題目描述

給定 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

解決方法

有兩種方法:一是暴力列舉,二是用雙指標

// class Solution {
// public:
//     int maxArea(vector<int>& height) {
//         //方法1:暴力列舉
//         if (height.size()==2) return min(height[0],height[1]);
        
//         int result=INT_MIN;
//         for (int i=0;i<height.size();i++)
// for (int j=height.size()-1;j>=0;j--){ // if (i>=j) break; // result=max(result,(j-i)*min(height[i],height[j])) // } // return result; // } // }; class Solution { public: int maxArea(vector<int>& height) { //方法2:雙指標 if
(height.size()==2) return min(height[0],height[1]); int result=INT_MIN; int left=0,right=height.size()-1; while(left<right){ result=max(result,(right-left)*min(height[left],height[right])); if (height[left]<height[right]) left++; else right--; } return result; } };