给定一个数组height,长度为n,每个数代表坐标轴中的一个点的高度,height[i]是在第i点的高度,请问,从中选2个高度与x轴组成的容器最多能容纳多少水
1.你不能倾斜容器
2.当n小于2时,视为不能形成容器,请返回0
3.数据保证能容纳最多的水不会超过整形范围,即不会超过231-1
数据范围:
如输入的height为[1,7,3,2,4,5,8,2,7],那么如下图:
[1,7,3,2,4,5,8,2,7]
49
[2,2]
2
[5,4,3,2,1,5]
25
public int maxArea (int[] height) { //面积,底*高,面积取决于短柱子 //较短边长*底部距离,(j-i)已经拉到最长,所以能改变的只有height[短],舍弃较短的边 if(height.length<2) return 0; int ans=0; int left=0; int right=height.length-1; while(left<right){ int areas=Math.min(height[left],height[right])*(right-left); ans=Math.max(ans,areas); if(height[left]<height[right]) left++; else right--; } return ans; }
public class Solution { public int maxArea1 (int[] height) { // write code here int length = height.length; if (length < 2) return 0; int max = 0; int left = 0; int right = length - 1; while (left < right) { max = Math.max(max, Math.min(height[left], height[right]) * (right - left)) ; if (height[left] < height[right]) left++; else right--; } return max; } // for(int i = 0;i <length ;i++) { // for (int j = i + 1;j < length ;j++) { // if (height[i] >= height[j]) { // max = Math.max(max,(j-i)*height[j]); // }else{ // max = Math.max(max,(j-i)*height[i]); // } // } // } }
public int maxArea (int[] height) { if(height.length<2){ return 0; } int i = 0,j = height.length-1; //初始化双指针,一个指头,一个指尾 int area = 0; //初始化面积 while(i<j){ int temp = height[i]>height[j]?height[j]*(j-i):height[i]*(j-i); //计算每一次的面积 area = area>temp?area:temp; //area每次取大的面积 if(height[i]>height[j]){ //短板移动,谁短谁动 j--; }else{i++;} } return area; }
import java.util.*; public class Solution { public int maxArea (int[] height) { // write code here int ans = 0; int l = 0, r = height.length - 1; while (l < r) { ans = Math.max(ans, Math.min(height[l],height[r]) * (r - l));//计算盛水选择短板 if (height[l] < height[r]) ++l; else --r; //移动短板 } return ans; } }
public int maxArea (int[] height) { // write code here int leftIndex = 0; int rightIndex = height.length-1; int maxArea = 0; while(leftIndex<rightIndex) { int leftHeight = height[leftIndex]; int rightHeight = height[rightIndex]; int currentArea = 0; if(leftHeight <= rightHeight) { currentArea = leftHeight * (rightIndex-leftIndex); leftIndex ++; } else { currentArea = rightHeight * (rightIndex-leftIndex); rightIndex --; } if(currentArea > maxArea) { maxArea = currentArea; } } return maxArea; }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param height int整型一维数组 * @return int整型 */ public int maxArea (int[] height) { // write code here //特殊情况 if(height.length==0||height.length==1){return 0;} //一般情况 int left=0,right=height.length-1; int max=Integer.MIN_VALUE; while(left<right){ int V=(right-left)*Math.min(height[left],height[right]); max=V>max?V:max; if(Math.min(height[left],height[right])==height[left]){ left++; }else{ right--; } } return max; } }
import java.util.*; public class Solution { public int maxArea (int[] height) { int n = height.length; int res = 0; int left = 0, right = n-1; while(left < right){ res = Math.max(res, (right - left) * Math.min(height[left], height[right])); if(height[left] < height[right]) left++; else right--; } return res; } }
//双指针 //对于遍历到的l,r先判断形成的容器大小,和max比较,容器大小的高度,由较小的高度决定 //因为无论是l动还是r动,都会让宽变小,此时要找的是最大容器值 //所以要让高度尽量高,因为现在的瓶颈在较低的边上,所以较低的边所在的位置移动 public int maxArea (int[] height) { // write code here if(height==null||height.length<2) return 0; int l=0; int r= height.length-1; int max=Integer.MIN_VALUE; while (l<r){ int index= height[l]<= height[r]?l:r; max=Math.max(max,(r-l)* height[index]); if (index==l) l++; else r--; } return max; }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param height int整型一维数组 * @return int整型 */ public int maxArea(int[] height) { if (height == null || height.length == 0 || height.length == 1) { return 0; } // write code here int max = Integer.MIN_VALUE; int start = 0; int end = height.length - 1; while (start < end) { if (height[start] < height[end]) { max = Math.max((end - start) * height[start], max); start++; } else { max = Math.max((end - start) * height[end], max); end--; } } return max; } }
public int maxArea(int[] height) { int left = 0, right = height.length - 1; int res = 0; while (left < right) { if (height[left] >= height[right]) { res = Math.max(res, height[right] * (right - left)); right--; } else { res = Math.max(res, height[left] * (right - left)); left++; } } return res; }
public int maxArea (int[] height) { // write code here if (height.length < 2) return 0; int i = 0, j = height.length - 1; int maxArea = 0; while (i <= j) { if (height[i] <= height[j]) { maxArea = Math.max(maxArea, height[i] * (j - i)); i++; } else { maxArea = Math.max(maxArea, height[j] * (j - i)); j--; } } return maxArea; }
public class Solution { public int maxArea (int[] height) { int left = 0, right = height.length-1; int res = 0; while (left < right) { int area = Math.min(height[left], height[right]) * (right -left); res = Math.max(res, area); if (height[left] < height[right]) { left++; } else { right--; } } return res; } }