Container With Most Water

Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container.

开始没读懂题目,参数是vector<int> &height, 其中的第i位与第i位的值(i, height[i])是坐标平面上的一个点,它与x轴做垂直线,这样就形成了i个垂直于x轴的线,假设这些是盛水的段短,求任意两个短板间水的容量最大值。

O(n^2):

Judge Small:Accepted!

Judge Large: Time limited Exceeded

  1. int maxArea(vector<int> &height) {  
  2.         // Start typing your C/C++ solution below  
  3.         // DO NOT write int main() function  
  4.         int size = height.size();  
  5.         int max = 0;  
  6.         for(int i = 0; i < size; ++i)  
  7.         {  
  8.             for(int j =i+1; j < size; ++j)  
  9.             {  
  10.                 int min = height[i] < height[j] ? height[i] : height[j];  
  11.                 int tmp = min*(j-i);  
  12.                 if(tmp> max) max = tmp;  
  13.             }  
  14.         }  
  15.         return max;  
  16.     }  

最终想到一个解决方法:取最左边的为left,最右边的为right,所有可能比这种大的情况只能是这两个高度较小的那一端向中间移动。一直循环这个动作,最大值肯定在其中。

O(n):

  1. int maxArea(vector<int> &height) {  
  2.         // Start typing your C/C++ solution below  
  3.         // DO NOT write int main() function  
  4.         int size = height.size();  
  5.         int left = 0, right = size-1;  
  6.         int max = 0;  
  7.         while(left < right)  
  8.         {  
  9.             int minheight = min(height[left],height[right]);  
  10.             int tmp = minheight*(right-left);  
  11.             max = max > tmp ? max : tmp;  
  12.             if(height[left]<height[right])left++;  
  13.             else right--;  
  14.         }  
  15.         return max;  
  16.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值