LeetCode修炼之路----------11.盛最多水的容器
程序员文章站
2024-03-09 16:08:43
...
11.盛最多水的容器
题目如下:
解题代码与解析
public int maxArea(int[] height) {
//指向最左边和最右边的两个变量
int left = 0, right = height.length - 1;
//假设最左和最右的两条线组成的面积最大
int maxarea = (height.length - 1) * Math.min(height[left], height[right]);
//最多height.length-1次,两指针相遇
// 因为我们要试所有的线所组成的面积,所有要for循环;在换线的过程中始终记录最大的那两条线组成的面积
for (int i = 0; i < height.length - 1; i++) {
//判断指针相遇
if (left < right) {
/*
* 由于最短的那一条线决定了高度,所以换两条线中最短的那条出来,换成更高的
* */
if (height[left] > height[right]) {
// 这里代表左边的线更高,所有要换右边的线
right--;
// 虽然要换线,但是换完线的面积不一定比没换的大,所以要进行比较是以前大还是换完大,maxarea记录最大的
maxarea = Math.max(maxarea, Math.min(height[left], height[right]) * (right - left));
} else {
// 这里代表右边的更高,所有要换左边的线
left++;
// 这里也是一样要比较换完的面积和之前的面积
maxarea = Math.max(maxarea, Math.min(height[left], height[right]) * (right - left));
}
} else{
break;
}
}
return maxarea;
}
解题思路:
- 由于是由两条线组成的面积,所以可以假设由最左和最右的两条线组成的面积最大
- 组成面积的时候是由两条线中短的那条决定高度的,所以更换短的那一条线,换成比它高的再比较面积是否有增加
- 遍历数组找到组成面积最大的两条线
结果如下:
谢谢阅读,如有不对之处请指出!