力扣题目
解题思路
java代码
力扣题目:
给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1] 输出:1
解题思路:
算法原理:
使用双指针法,从数组的两端向中间逐渐靠拢,计算每次指针所指位置形成的容器面积,并更新最大面积。
思路:
初始时,左右指针分别位于数组的两端。计算当前指针形成的容器面积,通过比较左右指针所指高度,移动高度较小的指针,因为移动高度较大的指针不可能得到更大的面积。不断重复这个过程,直到左右指针相遇,期间始终更新最大面积。
代码分析:
- 在
maxArea
方法中,首先初始化左右指针和最大面积变量。 - 在循环中,计算当前指针形成的面积,并与最大面积比较更新。
- 根据左右指针高度的大小移动相应的指针。
时间复杂度:O(n),只需要遍历数组一次。
空间复杂度:O(1),只使用了固定的额外空间。
java代码:
package org.example.mouth8;
public class Leetcode11 {
public static void main(String[] args) {
int[] height = {1, 8, 6, 2, 5, 4, 8, 3, 7};
System.out.println(maxArea(height));
}
public static int maxArea(int[] height) {
int left = 0;
int right = height.length - 1;
int max = 0;
while (left < right) {
int area = Math.min(height[left], height[right]) * (right - left);
max = Math.max(max, area);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return max;
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项