返回
LeetCode 盛最多水的容器:中等题也不带怕!
前端
2023-11-09 07:55:11
前言
各位技术大牛们,今天咱们不谈简单题,来点硬菜!LeetCode 中等题——盛最多水的容器,了解一下?这道题可是有讲究的,虽然编码简单,但思想绝妙!话不多说,上车!
问题
给你一个由 n 个正整数构成的数组 heights ,表示一堆矩形柱子的高度,其中第 i 个柱子的高度为 heights[i]。
在数轴上放置 k 个竖直线,将数组划分为 k+1 个区间,每个区间有 1 个或多个柱子。
对于一个区间的宽度 width,满足至少有一个柱子的高度等于 width,我们称这样的区间为有效区间。
返回可形成的最大有效区间的宽度。
问题分析
看到这个题目,是不是有点晕乎乎?别慌,我来帮大家理清思路:
- 核心思想: 寻找两个柱子,使它们之间的距离最远且两个柱子之间没有比它们高的柱子。
- 转化问题: 将柱子的高度视为两条线段,它们之间的距离就是我们要求的宽度,而目标就是找到最长的两条线段。
算法实现
现在我们知道了解题思路,接下来就是编码实现啦!
思路步骤:
- 初始化两个指针 left 和 right,分别指向数组的两端。
- 计算当前宽度和最大宽度。
- 移动 left 或 right 指针,使当前宽度最大。
- 记录最大宽度。
- 重复步骤 2-4,直到 left 和 right 相遇。
代码示例:
def maxArea(heights):
left, right = 0, len(heights) - 1
max_area = 0
while left < right:
width = right - left
height = min(heights[left], heights[right])
area = width * height
max_area = max(max_area, area)
if heights[left] < heights[right]:
left += 1
else:
right -= 1
return max_area
代码解读
- 初始化两个指针,分别指向数组的两端。
- 进入循环,计算当前宽度和面积,并记录最大面积。
- 比较左右两侧柱子的高度,将较低的一侧指针向中间移动。
- 重复以上步骤,直到指针相遇。
总结
通过解决这道中等题,我们不仅收获了算法思想,还掌握了以下要点:
- 理解 LeetCode 题目的核心思想。
- 将复杂问题分解成简单步骤。
- 运用指针技巧优化算法。
下次遇到中等题,也不带怕!祝各位技术大牛们,LeetCode 之路畅通无阻!