LeetCode11-盛最多水的容器

Posted 爆米花好美啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    
;

以上是关于LeetCode11-盛最多水的容器的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode:11. 盛最多水的容器

( Leetcode 11 ). 盛最多水的容器

leetcode 11. 盛最多水的容器

leetcode 11.盛最多水的容器

LeetCode-11. 盛最多水的容器

LeetCode 11. 盛最多水的容器