一开始暴力解决,时间没通过
1 class Solution { 2 public: 3 int maxArea(vector<int>& height) { 4 int maxArea=0,eachArea=0; 5 if(height.size()<2) return maxArea; 6 for(int i=0;i<height.size();i++) 7 for(int j=i+1;j<height.size();j++) 8 { 9 eachArea=(height[i]>height[j]?height[j]:height[i])*(j-i) ; 10 if(eachArea>maxArea) maxArea=eachArea; 11 } 12 return maxArea; 13 } 14 };
后来再去看大神的讲解,发现这个问题原理超简单:
所谓容器就可看作是一个矩形框,我们先把整数容量作为一边边长,两头最短的高作为另一边边长,这时得到一个矩形面积。后面要找到比这个面积更大,此时矩形的一边缩小,那么只有另一边的边长变大,整体面积才有可能变大。所以,当容器由两头向中间缩小时,得找比两头最短边还长的试试。这样最后时间复杂度也就为O(n)
以下是代码:
1 class Solution { 2 public: 3 int maxArea(vector<int>& height) { 4 int water=0,h; 5 int i=0,j=height.size()-1; 6 while(i<j) 7 { 8 h=min(height[i],height[j]); 9 if(water<h*(j-i))water=h*(j-i); 10 while(height[i]<=h && i<j)i++; 11 while(height[j]<=h && i<j)j--; 12 } 13 return water; 14 } 15 16 };