leetcode盛最多水的容器

1.暴力法

代码如下

class Solution {
public:
    int maxArea(vector<int>& height) {
        int imax=0;
        for(int i=0;i<height.size()-1;i++)
          for(int j=i+1;j<height.size();j++)
          {
              int num=min(height[i],height[j]);
              imax=max(imax,num*(j-i));
          }
        return imax;
    }
};

结果超时

2.双指针

首先设指针Left指向第一个元素,指针right指向最后一个元素

此时容器的底是最宽的,高位height[left],height[right]的最小值

当指针移动时,无论是left右移还是right左移,容器的底都是变小的,且left+1,与rihgt-1两种操作容器的底的宽度都是一样的,能改动的就是容器的高,此时,我们判断height[left],height[right]哪一个值小,放弃较小的值,保留较大的值,这样容器的面积才可能增大

设指针未移动指针面积为min(height[left],height[right])*(right-left)

则移动后的宽为right-left-1

如果不放弃较小的值,假设height[left]较小,即保留height[left],则此时容器的高为   min(height[left],height[right-1]),     高一定小于等于height[left],,,,,,,且宽度变小了,所以此时容器的面积一定小于之前的,故应该保留较大的值

 

代码如下:

class Solution {
public:
    int maxArea(vector<int>& height) {

       int len=height.size();
       int left=0,right=len-1;
       int ans=0;
       while(left<right)
       {
           ans=max(ans,(right-left)*min(height[left],height[right]));
           if(height[left]<height[right])
             left++;
            else
             right--;
       }
       return ans;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值