最大盛水容器问题_M

一、问题描述

给定n个正数a1,a2,...,an,其中每个元素代表一个坐标中的点(i,ai)。在(i,ai)与(i,0)间画出n条垂线 ,第i条线就是(i,ai)、(i,0)之间的连线,第i条垂线就是点(i,ai)到上述第i条连线的垂线。找出两条线,和x轴围成的面积组成一个容器,使得这个容器能盛最多的水。


二、思路

1.设置两个指针i,j,一头一尾,相向而行。假设i指向的挡板较低,j指向的挡板较高(height[i] < height[j])。
    下一步移动哪个指针?
    -- 若移动j,无论height[j-1]是何种高度,形成的面积都小于之前的面积。
    -- 若移动i,若height[i+1] <= height[i],面积一定缩小:但若height[i+1] > height[i], 面积则有可能增大。
    综上,应该移动指向较低挡板的那个指针。


三、Code

int MAX(int a, int b){return a > b ? a : b}
int MIN(int a, int b){return a < b ? a : b}

class Solution 
{
public:
    vector<int> maxArea(vector<int>& nums) 
    {
       int len = nums.size(), low = 0, high = len -1;
       int maxArea = 0;  
       while (low < high) 
       {
         maxArea = MAX(maxArea, (high - low) * MIN(height[low], height[high]));  
         if (height[low] < height[high]) 
	 {
	   low++;
	 } 
	 else
	 {
	   high--;
	 }
       }
       return maxArea;
    }
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值