返回

算法刷题之双指针,巧解盛水容器问题

前端

我们今天要来探讨一道算法刷题经典 —— 盛水容器问题。在这个问题中,你将面对一组非负整数,它们代表坐标平面上的一系列点,然后你需要找到其中两条线,使得它们与 x 轴构成的容器可以容纳最多的水。

乍一看,这道题似乎有点抽象,但只要我们用恰当的策略,就能将其巧妙地解决。今天,我们就来引入一个强大的技巧 —— 双指针法。

双指针法的本质是在一个数组或序列中使用两个指针,从相反的方向遍历。在这个问题中,我们将使用两个指针:left 和 right,分别指向数组的开头和结尾。我们从两边向中间推进,并在每次移动中计算当前容器的容量。

具体而言,我们首先初始化 left 和 right,然后计算当前容器的容量。如果左指针指向的点比右指针指向的点低,我们就向右移动左指针;否则,我们就向左移动右指针。每移动一次,我们就计算新容器的容量,并与之前计算的容量进行比较,保留容量最大的容器。

为什么双指针法在这个问题中如此有效呢?这是因为随着指针的移动,我们实际上是在探索所有可能的容器形状。当 left 指向的点比 right 指向的点低时,向右移动 left 可以增加容器的高度;当 right 指向的点比 left 指向的点低时,向左移动 right 可以增加容器的宽度。通过不断调整这两个指针,我们就能找到容量最大的容器。

现在,让我们用一个具体的例子来演示双指针法的应用。假设我们有一个数组 [1, 8, 6, 2, 5, 4, 8, 3, 7]。按照前面的步骤,我们可以逐步计算容器容量:

  1. 初始化 left = 0,right = 8。容器容量为 min(1, 8) = 1。
  2. left < right,向右移动 left。left = 1,right = 8。容器容量为 min(8, 8) = 8。
  3. left < right,向右移动 left。left = 2,right = 8。容器容量为 min(6, 8) = 6。
  4. left < right,向右移动 left。left = 3,right = 8。容器容量为 min(2, 8) = 2。
  5. left < right,向右移动 left。left = 4,right = 8。容器容量为 min(5, 8) = 5。
  6. left < right,向右移动 left。left = 5,right = 8。容器容量为 min(4, 8) = 4。
  7. left < right,向右移动 left。left = 6,right = 8。容器容量为 min(8, 8) = 8。
  8. left < right,向右移动 left。left = 7,right = 8。容器容量为 min(3, 8) = 3。
  9. left < right,向右移动 left。left = 8,right = 8。容器容量为 min(7, 8) = 7。

此时,left 指向了数组的末尾,算法结束。最大容量为 8,由 [3, 8] 构成的容器形成。

双指针法在解决盛水容器问题时展示了其强大的优势。通过从数组的两端同时遍历,我们可以高效地探索所有可能的容器形状,并找到容量最大的容器。希望今天的解析对你的算法刷题之旅有所启发,祝你在算法的世界中取得更大的成就!