盛最多水的容器
【题目描述】
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
说明:你不能倾斜容器。
【示例 1】
输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
【示例 2】
输入:height = [1,1] 输出:1
【代码实现】
1. 爆破大法除了会超出时间限制,其他都挺好用的。。。
1 class Solution { 2 public int maxArea(int[] height) { 3 int area=0; 4 int maxarea=0; 5 for(int i=0;i<height.length;i++){ 6 for(int j=i+1;j<height.length;j++){ 7 area=(j-i)*Math.min(height[i],height[j]); 8 if(area>maxarea){ 9 maxarea=area; 10 } 11 } 12 } 13 return maxarea; 14 } 15 }
2. 双指针
算法流程:
初始化: 双指针 ii , jj 分列水槽左右两端;
循环收窄: 直至双指针相遇时跳出;
更新面积最大值 resres ;
选定两板高度中的短板,向中间收窄一格;
返回值: 返回面积最大值 resres 即可;
执行用时:5 ms, 在所有 Java 提交中击败了15.05%的用户
内存消耗:51.8 MB, 在所有 Java 提交中击败了55.33%的用户
1 class Solution { 2 public int maxArea(int[] height) { 3 int area=0; 4 int maxarea=0; 5 int i=0; 6 int j=height.length-1; 7 while(i<j){ 8 area=(j-i)*Math.min(height[i],height[j]); 9 if(maxarea<area){ 10 maxarea=area; 11 } 12 if(height[i]<=height[j]){ 13 i++; 14 }else{ 15 j--; 16 } 17 } 18 return maxarea; 19 } 20 }
3. 双指针优化
执行用时:2 ms, 在所有 Java 提交中击败了98.80%的用户
内存消耗:51.2 MB, 在所有 Java 提交中击败了86.03%的用户
class Solution { public int maxArea(int[] height) { int area=0; int maxarea=0; int i=0; int j=height.length-1; while(i<j){ int left = height[i]; int right = height[j]; area=(j-i)*Math.min(left,right); if(maxarea<area){ maxarea=area; } if (left <= right) { while (left >= height[++i] && i < j) { } } else { while (right >= height[--j] && i < j) { } } } return maxarea; } }