题目描述:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
题目地址:https://leetcode-cn.com/problems/container-with-most-water/
思路:
1、使用穷举法,依次从左到右选取基点柱子,再与右边剩余的柱子进行计算,取最大值。
2、双指针法,i、j分别指向数组的最左端和最右端,让矮点的柱子往中间进一步。因为容器的宽度是矮柱子的高度,如果高柱子往中间进一步,要么遇到更高的柱子(那么不动的矮柱子仍然低于这个柱子,宽度不变,要么遇到更矮的柱子(宽度变小), 此时长度也变小了,那么面积肯定是小的。如果让矮柱子进一步,那么可能让宽增长的效果大于长缩小的效果从而面积更大。
代码展示:
1、
/**
* @ClassName Solution
* @Description
* @Author Administrator
* @Date 2020/6/3 9:52
* @Version 1.0
**/
public class Solution {
public int maxArea(int[] height) {
int max = 0;
for(int i = 0; i < height.length - 1; i++){
for(int j = i + 1; j < height.length; j++){
int temp = Integer.min(height[i], height[j]);
temp = temp * (j - i);
if(temp > max)
max = temp;
}
}
return max;
}
}
2、
public class Solution{
public int maxArea(int[] height) {
int max = 0;
for(int i = 0, j = height.length - 1; i < j;){
int temp = Integer.min(height[i], height[j]);
temp = temp * (j - i);
if(temp > max)
max = temp;
if (height[i] > height[j]) {
j--;
} else {
i++;
}
}
return max;
}
}