给定一个数组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
import java.util.*;
// @@@ 盛水: 类似接雨水
// 双指针i,j初始两端,每次移动小的那端,遇到更高的更新两端大小关系 & 面积
// 直到i,j相遇
public class Solution {
public int maxArea (int[] height) {
if (height.length == 0) return 0;
int res = 0, i = 0, j = height.length - 1, left = height[i], right = height[j];
while (i <= j) {
res = Math.max(res, Math.min(left, right) * (j - i)); // 计算面积
// System.out.printf("i=%d j=%d %d %d res=%d\n", i, j, height[i], height[j], res);
// 左端更矮, 移动i
if (left <= right) {
while (i <= j && height[i] <= left) { // 更低高度的,面积肯定更小,略过
i++;
}
if (i <= j) left = height[i]; // 遇到更高的,更新左端高
}
// 右端更矮, 移动j
else {
while (i <= j && height[j] <= right) {
j--;
}
if (i <= j) right = height[j];
}
}
return res;
}
} public class Solution {
public int maxArea (int[] height) {
int max = 0;
int left=0;
int right=height.length-1;
while(left<right){
max=Math.max(max,(right-left)*Math.min(height[left],height[right]));
if(height[left]<height[right]) left++;
else right--;
}
return max;
}
}
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;
}