返回

LeetCode 盛最多水的容器:中等题也不带怕!

前端

前言

各位技术大牛们,今天咱们不谈简单题,来点硬菜!LeetCode 中等题——盛最多水的容器,了解一下?这道题可是有讲究的,虽然编码简单,但思想绝妙!话不多说,上车!

问题

给你一个由 n 个正整数构成的数组 heights ,表示一堆矩形柱子的高度,其中第 i 个柱子的高度为 heights[i]。

在数轴上放置 k 个竖直线,将数组划分为 k+1 个区间,每个区间有 1 个或多个柱子。

对于一个区间的宽度 width,满足至少有一个柱子的高度等于 width,我们称这样的区间为有效区间。

返回可形成的最大有效区间的宽度。

问题分析

看到这个题目,是不是有点晕乎乎?别慌,我来帮大家理清思路:

  • 核心思想: 寻找两个柱子,使它们之间的距离最远且两个柱子之间没有比它们高的柱子。
  • 转化问题: 将柱子的高度视为两条线段,它们之间的距离就是我们要求的宽度,而目标就是找到最长的两条线段。

算法实现

现在我们知道了解题思路,接下来就是编码实现啦!

思路步骤:

  1. 初始化两个指针 left 和 right,分别指向数组的两端。
  2. 计算当前宽度和最大宽度。
  3. 移动 left 或 right 指针,使当前宽度最大。
  4. 记录最大宽度。
  5. 重复步骤 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 之路畅通无阻!