LeetCode11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

1.暴力算法

//暴力算法
func maxArea(height []int) int {
    max := 0//用于记录当前找到的最大容器面积。
    m := 0//表示两个线段之间的水平距离(宽度)
    n := 0//表示两个线段中较短的高度
    sum := 0//用于计算当前组合的容器面积
    j := 0//内层循环的索引变量,用于枚举每个可能的右边界
    lens :=len(height)
    for  i := 0;i<lens-1;i++{
        for j = i+1;j<lens;j++{
            m = j-i
            if height[i]<height[j]{//是两个线段中较短的高度.因为容器的容量由较短的线段决定。
                n = height[i]
            }else {
                n = height[j]
            }
            sum = n*m
            if sum > max{//如果当前组合的面积大于之前记录的最大面积,则更新 max
                max = sum
            }
        }
    }
    return max
}

 通过双循环遍历每种长宽所组成的长方形,并从中选出最大面积。

2.双指针法

func maxArea(height []int) int {
   right := len(height)-1//指向数组的末尾位置
    left := 0//指向数组的起始位置
    max := 0//用于记录当前找到的最大容器面积
    m := 0//表示两个指针之间的水平距离(宽度
    n := 0//表示两个指针所指线段的较短高度
    sum := 0// 用于计算当前容器的面积
        for left < right{
            m = right-left
            if height[left]<=height[right]{//移动较短的线段有可能找到更高的线段,从而增加容器的面积
                n = height[left]
                left ++
            }else {
                n = height[right]
                right --
            }
            sum = n*m
            if sum > max{
                max = sum
            }
    }
    return max
}

利用双指针法,

  • 通过两个指针从数组的两端开始向中间移动,逐步缩小搜索范围。

  • 每次移动较短的线段对应的指针,因为移动较短的线段有可能找到更高的线段,从而增加容器的面积。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值