首页 >后端开发 >Golang >两指针技术

两指针技术

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-16 10:58:581016浏览

A técnica dos dois ponteiros

Go 中用两个指针最大化容器区域

在使用数组或列表的算法中,两指针技术因其效率而脱颖而出。 在本文中,我们将其应用于经典的“装有最多水的容器”问题,该问题寻求图形上两条垂直线之间的最大面积。

问题描述

给定一个表示垂直线高度的非负整数数组,找到与 x 轴一起形成面积最大的容器的一对线。

示例

考虑数组height = [1, 8, 6, 2, 5, 4, 8, 3, 7]。 目标是确定哪两条线生成最大面积。

双指针技术

该技术使用两个指针,一个位于数组的开头,一个位于数组的末尾,将它们迭代地移向中心以找到最佳解决方案。

一步一步

  1. 启动:

    • maxArea 初始化为 0,存储迄今为止找到的最大区域。
    • 两个指针,l(左)和r(右),分别位于数组的开头和结尾。
  2. 迭代:

    • 只要 l 小于 r,循环就会继续。
    • lr 中的线之间的面积计算为 min(height[l], height[r]) * (r - l)
    • 如果计算的面积较大,
    • maxArea 会更新。
  3. 指针移动:

    • 为了优化搜索,指向较小行的指针被移动:
      • 如果 height[l] < height[r],则递增 l
      • 否则,递减r
  4. 返回:

    • lr相交时,循环结束,maxArea包含最大面积。

详细示例

让我们分析一下数组height = [1, 8, 6, 2, 5, 4, 8, 3, 7]:

  1. 启动:

    • maxArea = 0
    • l = 0(高度 1),r = 8(高度 7)
  2. 第一次迭代:

    • 区域:min(1, 7) * (8 - 0) = 8
    • maxArea = max(0, 8) = 8
    • 移动l(因为height[l] < height[r]
  3. 第二次迭代:

    • l = 1(高度 8),r = 8(高度 7)
    • 区域:min(8, 7) * (8 - 1) = 49
    • maxArea = max(8, 49) = 49
    • 移动r

...依此类推,重复这个过程,直到双手相遇。

最终结果将是maxArea = 49

去解决

按照 Go 代码实现该技术:

package maxarea

func maxArea(height []int) int {
    maxArea := 0
    l, r := 0, len(height)-1

    for l < r {
        area := min(height[l], height[r]) * (r - l)
        maxArea = max(maxArea, area)
        if height[l] < height[r] {
            l++
        } else {
            r--
        }
    }
    return maxArea
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

结论

双指针技术为涉及数组的问题提供了有效的解决方案。 在“盛水最多的容器”的情况下,它保证了线性时间复杂度,使其成为一种理想的方法。

以上是两指针技术的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn