LeetCode11 盛最多水的容器

57 阅读1分钟

leetcode.cn/problems/co…

image.png

暴力法 (超时)

最先想到的思路:逐个区间计算,取最大值

func maxArea(height []int) int {
    maxArea := 0
    if len(height) == 2{
        return min(height[0], height[1])
    }
    for i:=0; i<len(height); i++{
        for j:=i+1; j<len(height);j++{
            area := min(height[i], height[j]) * (j-i)
            maxArea = max(maxArea, area)
        }
    }
    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
}

解法一:双指针

用 left 和 right 两个指针从两端向中心收缩,一边收缩一边计算 [left, right] 之间的矩形面积,取最大的面积值即是答案

技巧:循环中每次if语句为什么要移动高度较低的一边,因为矩形的高度是由 min(height[left], height[right]) 即较低的一边决定的,如果移动较低的那一边,那条边可能会变高,使得矩形的高度变大,进而就「有可能」使得矩形的面积变大;相反,如果你去移动较高的那一边,矩形的高度是无论如何都不会变大的,所以不可能使矩形的面积变得更大。

   func maxArea(height []int) int {
        left, right := 0, len(height)-1
        maxArea := 0
        for left < right{
            maxArea = max((min(height[left], height[right]) * (right-left)), maxArea)
            // 移动较低的一边
            if height[left] < height[right] {
                left++
            }else{
                right--
            }
        }
        return maxArea
    }

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

    func min(a, b int) int{
        if a < b {
            return a
        }
        return b
    }
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)