盛最多水的容器
程序员文章站
2022-05-20 12:57:10
...
题目描述: 给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
解法1:暴力法
思路: 对所有的线两两求出面积 时间复杂度O(n2)
解法2: 双向指针法
思路:一个指针指向第一个元素, 另一个指针指向最后一个元素. 每次都求一个面积,并用一个变量保存起来,并且我们每次移动指向较短线条的那个指针. 然后在求面试,如果比上一次的面积大则更心最大值.否则重复上面的过程
代码:
class Solution {
private int[] height;
public int maxArea(int[] height) {
this.height = height;
int l = 0, r = height.length - 1;
int maxArea = getArea(l, r);
while (l != r) {
if (height[l] <= height[r]) {
l++;
} else {
r--;
}
maxArea = Math.max(maxArea, getArea(l, r));
}
return maxArea;
}
private int getArea(int l, int r) {
int length = r - l;
int width = Math.min(height[l], height[r]);
return length * width;
}
public static void main(String[] args) {
System.out.println(new Solution().maxArea(new int[]{1, 8, 6, 2, 5, 4, 8, 3, 7}));
}
}
上一篇: js 覆盖和重载 函数