1、解题思路
- 暴力法:遍历所有可能的两根高度组合,计算每对组合的容积,并记录最大容积。时间复杂度为 O(n^2^),对于 n=10^5^ 来说,这种方法显然不可行。
- 双指针法:使用两个指针,一个指向数组的开始(left),一个指向数组的末尾(right)。计算当前指针所指向的两根高度形成的容积,并更新最大容积。移动指针的策略:移动高度较小的指针,因为这样可以保留较高的高度,有可能获得更大的容积。时间复杂度为O(n),空间复杂度为O(1)。
2、代码实现
C++
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param height int整型vector
* @return int整型
*/
int maxArea(vector<int>& height) {
// write code here
int left = 0;
int right = height.size() - 1;
int max_water = 0;
while (left < right) {
int current_water = min(height[left], height[right]) * (right - left);
max_water = max(max_water, current_water);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return max_water;
}
};
Java
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param height int整型一维数组
* @return int整型
*/
public int maxArea (int[] height) {
// write code here
int left = 0;
int right = height.length - 1;
int maxWater = 0;
while (left < right) {
int currentWater = Math.min(height[left], height[right]) * (right - left);
maxWater = Math.max(maxWater, currentWater);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxWater;
}
}
Python
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param height int整型一维数组
# @return int整型
#
class Solution:
def maxArea(self , height: List[int]) -> int:
# write code here
left = 0
right = len(height) - 1
max_water = 0
while left < right:
current_water = min(height[left], height[right]) * (right - left)
max_water = max(max_water, current_water)
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_water
3、复杂度分析
- 双指针法 :使用两个指针从数组两端向中间移动,每次移动高度较小的指针,这样可以保留较高的高度,有可能获得更大的容积。
- 容积计算 :容积由两个高度中的较小者与它们之间的距离决定,即 min(height[left], height[right]) * (right - left)。
- 时间复杂度 :只需遍历数组一次,时间复杂度为O(n)。
- 空间复杂度 :仅使用常数空间,空间复杂度为O(1)。