力扣热题100道之11盛最多水的容器
·
解法
双指针法,左右两边各一个指针,每次选择左右两边的指针中较小的那一个,左移或右移,在移动两者中较小的那一个之前,这两个构成的面积肯定是比那个较小的值和别的值相乘更大的,宽乘高,宽最大,高选的是两者中间较小的那一个。这就是这个方法在算法层面的优势。
我之前还用了一些别的方法,时间复杂度都是O(n2),不是内存超限制,就是运行时间超限制。
后面我也将我的,在力扣中点运行成功,但点提交成功不了的代码(一个内存超出,一个运行时间超出)的代码都附在本文中。
正确代码
class Solution {
public int maxArea(int[] height) {
int n =height.length;
int left=0;
int right=n-1;
int max=0;
while(left!=right){
int h=Math.min(height[left],height[right]);
int w=right-left;
int area=h*w;
if(area>max) max=area;
if (height[left]>height[right]){
right--;
}else{
left++;
}
}
return max;
}
}
历史代码
报错内存超限制的代码
class Solution {
public int maxArea(int[] height) {
int n=height.length;
int num=(n-1)*n/2;
int[] allSize=new int[num];
int poi=0;
for(int i=0;i<n-1;i++){
for(int j=i+1;j<=n-1;j++){
int h=Math.min(height[i],height[j]);
int w=j-i;
allSize[poi]=h*w;
poi++;
}
}
int m=0;
for(int i=0;i<num;i++){
if(allSize[i]>m){
m=allSize[i];
}
}
return m;
}
}
报错超出时间限制的代码
class Solution {
public int maxArea(int[] height) {
int n=height.length;
int max=0;
int[] allSize=new int[n];
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<=n-1;j++){
int h=Math.min(height[i],height[j]);
int w=j-i;
allSize[j]=h*w;
}
for(int p=0;p<n;p++){
if(allSize[p]>max){
max=allSize[p];
}
}
}
return max;
}
}
更多推荐



所有评论(0)