/** * 参考官方解法(双指针) */ publicintmaxArea3(int[] height){ int area = 0; int i = 0,j = height.length-1; while (i < j) { int minH = Math.min(height[i],height[j]); area = Math.max(area,minH * (j-i)); if (height[i] < height[j]) { i ++; }else { j --; } } return area; }
另一种写法
到网站翻到一种牛掰写法(原理和上一种解法一致)
1 2 3 4 5 6 7 8 9 10 11 12 13
/** * 到国外网站翻到了一种牛掰写法(原理和上一种解法一致) */ publicintmaxArea(int[] height){ int area = 0; for (int i = 0,j = height.length-1; i<j;) { int minH = height[i] < height[j] ? height[i++] : height[j--]; //j-i加1的原因是上面i++/j--的时候向右或向左移动了一格,方便下次遍历 //所以在进行当前计算的时候要还原到原来横坐标的宽度 area = Math.max(area, minH * (j - i +1)); } return area; }
上一种写法进行简单的优化
1 2 3 4 5 6 7
// 再优化,将j-i的操作提到 i++ j-- 操作的前面 publicintmaxArea(int[] height){ int area = 0; for (int i = 0,j = height.length-1; i<j;) area = Math.max((j-i)* (height[i] < height[j]?height[i++]:height[j--]),area); return area; }
参考如上写法,对第二种解法简单进行简单改造
后面几种的写法思路、本质都是一样,只是写法有些不同而已
1 2 3 4 5 6 7 8 9
publicstaticintmaxArea4(int[] height){ int area = 0; int i = 0,j = height.length-1; while (i < j) { int minH = height[i] < height[j] ? height[i++] : height[j--]; area = Math.max(area,minH*(j-i+1)); } return area; }