其实这个题目挺简单的,就是把想法落实到代码中即可可以通过暴力方法强行解出来,无非就是最短的乘一个索引差值。

这个是我一开始暴力出来的代码,我想着不就是判断一下两个柱子谁短,让短的一边去计算出面积就行了,但是运行时间太长了5ms。

class Solution {
    public int maxArea(int[] height) {
             int areaMax = 0;
        int area = 0;
        for (int i = 0; i < height.length; i++) {
            int temp = height[i];
            for (int j = height.length - 1; j > i; j--) {

                if (height[j] > temp) {
                    area = (j - i) * temp;
                    if(area>areaMax){
                        areaMax = area;
                    }
                    break;
                } else {
                    area = (j - i) * height[j];
                    if(area>areaMax){
                        areaMax = area;
                    }
                }
            }
        }
            return areaMax;
    }
}

过了一个多月我才重新做这个题目,我去学习了一下双指针,后面我发现一个问题,比如第一个柱子比其他的柱子都短,那既然这样我还有必要去计算中间的面积吗。

后面我梦到啥就写啥,既然没必要计算中间的了,反正是左指针和右指针,左边比右边最远的柱子短计算完后直接让左指针加一就行了,但是又发现了个问题,如果左边的比右边的长咋办,这个没办法跳了。

class Solution {
    public int maxArea(int[] height) {
        int leftPoint = 0;
        int rightPoint = height.length-1;
        int max = 0;
        int area = 0;
        while (leftPoint < height.length-1){
            if(height[leftPoint] <= height[rightPoint]){
                max = height[leftPoint] * (rightPoint -leftPoint);
                leftPoint++;
                rightPoint = height.length-1;
            }else {
                if(height[rightPoint]  == height[leftPoint]){
                    leftPoint++;
                    rightPoint = height.length-1;
                }
                max = height[rightPoint] * (rightPoint - leftPoint);
                rightPoint--;
            }
            if(max>area){
                area = max;
            }
        }
    return area;
    }
}

后面我就去看答案了,我居然不会用Math.min。

我想到了跳跃的思路,但是感觉实现起来有点麻烦,没想到Math.min这个工具方法这么好。

class Solution {
    public int maxArea(int[] height) {
        int leftPoint = 0;
        int rightPoint = height.length-1;
        int area = 0;
        int temp = 0;
        int min =0;
        for (int i = 0; i < height.length; i++) {
             min = Math.min(height[leftPoint], height[rightPoint]);
             temp = min *(rightPoint -leftPoint);
            if (height[leftPoint] > height[rightPoint]) {
                rightPoint--;
            }else {
                leftPoint++;
            }
            if (temp > area) {

                area = temp;
            }
        }
    return area;
    }
}

Logo

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

更多推荐