返回

你还在用暴力法解题?巧解LeetCode 第11 题,打造最优盛水容器!

后端

轻松解开 LeetCode 11 题:“盛最多水的容器”

引言

欢迎来到 LeetCode 11 题:“盛最多水的容器”的精彩世界,这是一道中等难度的算法题,将考验你的编程技巧和智力极限。在这篇文章中,我们将深入探讨解决这道题的巧妙思路和技巧,让你轻松过关!

问题陈述

给你一个非负整数数组 heights,其中 heights[i] 表示第 i 个柱子的高度。假设每个柱子顶部都装有水,那么最多能装多少水?

巧妙的解题思路:双指针法

要解决这道题,我们可以采用一种简单高效的算法——双指针法。想象一下,我们有两个指针:leftright,分别指向数组的首尾元素。我们的目标是不断移动这两个指针,并计算它们之间的盛水量。

步骤分解

  1. 初始化指针和最大盛水量:leftright 指针分别指向数组的首尾元素,并将 max_area 初始化为 0。
  2. 计算当前盛水量: 计算 leftright 指针之间的盛水量,即 current_area = min(heights[left], heights[right]) * (right - left)
  3. 更新最大盛水量: 比较 max_areacurrent_area,保留较大者。
  4. 移动指针: 如果 heights[left] < heights[right],则移动 left 指针指向更右边的元素,否则移动 right 指针指向更左边的元素。
  5. 重复步骤 2-4: 不断重复步骤 2-4,直到 leftright 指针相遇。

代码示例

def max_area(heights):
  left, right = 0, len(heights) - 1
  max_area = 0

  while left < right:
    current_area = min(heights[left], heights[right]) * (right - left)
    max_area = max(max_area, current_area)

    if heights[left] < heights[right]:
      left += 1
    else:
      right -= 1

  return max_area

总结

双指针法是一种巧妙有效的算法,可以让你在时间复杂度为 O(n) 的情况下解决 LeetCode 11 题。通过不断移动指针并计算盛水量,我们可以找到数组中可以盛最多水的两个柱子之间的最大盛水量。

常见问题解答

  1. 为什么双指针法有效?

双指针法有效,因为它只遍历数组一次,并不断更新最大盛水量。它可以避免重复计算和无效的遍历。

  1. 如果数组中没有可以盛水的柱子呢?

在这种情况下,返回 0 即可。

  1. 如果数组中只有一个柱子呢?

在这种情况下,返回 0,因为只有一个柱子无法盛水。

  1. 双指针法还能解决哪些其他问题?

双指针法可以解决各种问题,例如寻找两个数之和、最长连续子数组和最长回文子串。

  1. 还有什么其他解决 LeetCode 11 题的方法吗?

除了双指针法之外,还可以使用蛮力法(时间复杂度为 O(n^2))、分治法和动态规划法。

结语

恭喜你成功掌握了解决 LeetCode 11 题的技巧!双指针法是一个强大的算法,可以帮助你解决各种编程问题。继续练习和探索算法的世界,祝你在算法之旅中取得成功!