解法

双指针法,左右两边各一个指针,每次选择左右两边的指针中较小的那一个,左移或右移,在移动两者中较小的那一个之前,这两个构成的面积肯定是比那个较小的值和别的值相乘更大的,宽乘高,宽最大,高选的是两者中间较小的那一个。这就是这个方法在算法层面的优势。

我之前还用了一些别的方法,时间复杂度都是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;
        
    }
}

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐