11. 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 and n is at least 2.
给定n个非负数字,代表n条垂线,在垂线之间装水,找出能装水最多的情况。
样例(如上图)
Example:
Input: [1,8,6,2,5,4,8,3,7] Output: 49
statement: (8-1)*min(8, 7)
思路1:
暴力法:遍历所有可能情况,找出最大值。
时间复杂度:O(n2)
空间复杂度:O(1)
1 class Solution { 2 public: 3 int maxArea(vector<int>& height) { 4 int size = height.size(); 5 if(size == 2) 6 return min(height[0], height[1]); 7 int res = 0; 8 for(int i=0; i<size; i++) 9 { 10 for(int j=i+1; j<size; j++) 11 { 12 int tmp = (j-i)*min(height[j],height[i]); 13 if(tmp > res) 14 res = tmp; 15 } 16 } 17 return res; 18 } 19 };
思路2:
两点逼近思想
1. 先取最左端和和最右端,然后计算容积,更新容积;
2. 更新l and r, 那一端长度height[]短,那一段就更新(++/--);
3. 输出最大容积。
时间复杂度:O(n)
空间复杂度:O(1)
1 class Solution { 2 public: 3 int maxArea(vector<int>& height) { 4 int size = height.size(); 5 if(size == 2) 6 return min(height[0], height[1]); 7 int res = 0; 8 int l =0, r = size-1; 9 while(l < r) 10 { 11 int tmp = (r-l)*min(height[r],height[l]); 12 if(tmp > res) 13 res = tmp; 14 if(height[l] > height[r]) 15 r--; 16 else 17 l++; 18 } 19 return res; 20 } 21 };