leetcode刷题19

j今天刷的题是Leecode第11题,题目要求是:

给定n个非负整数,每个整数代表一个坐标(i,ai),在坐标内画n条垂直线
* 垂直线i的两段分别是i,ai和i,0,找出其中的两条线,使得围城的面积最大
首先是一个暴力算法,即挨个组合,看总的面积那个组合最大,下面的代码耗时428ms,内存消耗44.7MB。代码如下:
public static int getArea(int[] height){
        int area=Integer.MIN_VALUE;
        for (int i = 0; i <height.length ; i++) {
            for (int j = 0; j <i ; j++) {
                int nowarea=area(height,i,j);
                if (nowarea>area){
                    area=nowarea;
                }
            }
        }
        return area;
    }
    public static int area(int[]nums,int i,int j){
        return Math.abs(i-j)*Math.min(nums[i],nums[j]);
    }

第二种方法是双指针遍历,,主要的难点在于指针的移动。双指针中,移动较小的那个。耗时6ms,内存消耗45.9MB

public static int getArea2(int[] height){
        int start=0;
        int end=height.length-1;
        int area=0;
        while (start<end){
            area=Math.max(area,(end-start)*Math.min(height[start],height[end]));
            if (height[start]<height[end]){
                start++;
            }else {
                end--;
            }
        }

        return area;
    }

猜你喜欢

转载自www.cnblogs.com/cquer-xjtuer-lys/p/11437266.html