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[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;
    }
};

  • LeetCode Container With Most Water 查找容水量最大的容器 动态规划法思想分析

你可能感兴趣的:(LeetCode)