LeetCode11-盛最多水的容器

/*
 * @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;
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章