一. 题目
-
题目
-
示例
输入:[1,8,6,2,5,4,8,3,7]
输出:49
二. 方法一: 暴力法(超时)
-
解题思路
- 从左到右开始遍历, 计算出任意两个之间围城的面积
- 再从右往左开始遍历, 计算出任意两个之间围城的面积
- 两次遍历后, 求得的值即为最大值
-
解题代码
def maxArea(height: List[int]) -> int: max_size = 0 for i in range(len(height) - 1): for j in range(i + 1, len(height)): if height[i] <= height[j]: size = height[i] * (j - i) if size > max_size: max_size = size for i in range(len(height) - 1, 0, -1): for j in range(i - 1, -1, -1): if height[i] <= height[j]: size = height[i] * (i - j) if size > max_size: max_size = size return max_size
-
分析
时间复杂度: O(n*2)
空间复杂度: O(1)
三. 方法二
-
解题思路
- 创建头尾两个指针: left, right
- 计算两者围城的面积:
min(height[left], height[right]) * (left - right)
- 将所指较小值的指针向中间移动一位(left + 1 或 right - 1)
移动较小值的原因:
因为面积有较小的值和距离的乘积决定, 只有移动较小值才有可能获取一个更大的面积 - 继续求面积, 遍历到中间时停止遍历
- 求出最大值, 返回即可
-
解题代码
def maxArea(self, height: List[int]) -> int: max_size, area = 0, 0 left, right = 0, len(height) - 1 while left < right: if height[left] >= height[right]: area = height[right] * (right - left) right -= 1 else: area = height[left] * (right - left) left += 1 max_size = max(max_size, area) return max_size
-
分析
时间复杂度: O(n)
空间复杂度: O(1)