/*
* @lc app=leetcode.cn id=11 lang=cpp
*
* [11] 盛最多水的容器
*
* https://leetcode-cn.com/problems/container-with-most-water/description/
*
* algorithms
* Medium (52.87%)
* Total Accepted: 29.7K
* Total Submissions: 56.1K
* Testcase Example: '[1,8,6,2,5,4,8,3,7]'
*
* 給定 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
*
*/
思路1: 簡單的暴力算法
思路2: 動態規劃的思想
// 動態規劃思想
// 首先給出面積公式 area=min(a[i],a[j]) * (j-i)
// 接着i,j位於最寬的兩端即初始空間0-n-1 那麼狀態轉移下一階段0-n-2或1-n-1,那麼如何選擇呢
// 如果a[0]<a[n-1], 應該變到1-n-1,因爲如果變到0-n-2,寬一定小1,高也可能再降低,所以面積一點變小不能選擇
// 同理如果a[0]>a[n-1]應該變到0-n-2
// 終止狀態即是i==j了
class Solution {
public:
int maxArea(vector<int>& height) {
int max_area=0;
int i=0,j=height.size()-1;
while(i<j){
max_area = max(max_area, min(height[i], height[j]) * (j-i));
if(height[i]<height[j])
i++;
else
j--;
}
return max_area;
}
};