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; }