笔试面试题目:盛水最多的容器

本文介绍了一种高效求解最大盛水量问题的算法。利用双指针技巧,从两端向中间遍历数组,确保每次更新都能得到当前条件下的最大盛水量。此方法避免了暴力搜索的低效,并给出了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     今天周末,来看G公司的一道面试题:

     求max{|i-j|*min{a[i], a[j]}}的值,其中a是正整数数组,i和j的区间为[0, n-1].

      这其实就是leetcode中的“盛水最多的容器”,如下:

       鲁迅说:暴力可以解决一切问题。

       胡适说:暴力能解决的问题,都不是问题。

       因为i和j的可能性是有限组合,所以暴力算法能得到结果,但无法通过面试。

       用动态规划吗?貌似也不好动态规划。

       我们可以采用双指针,分别指向头尾,计算出盛水值。然后向中间搜索,尝试找出更大的盛水可能性。     

       木桶理论告诉我们:对于两块确定的盛水挡板而言,盛水的多少是由短板决定的。

       所以,在向中间搜索时,从短板侧向中间移动指针,才有可能产生更大的盛水值。

       这是一个核心结论。

       至于代码,很简单,来看下:

func maxArea(a []int) int {
    n := len(a)

    if n < 2 {
        return 0
    }

    if n == 2 {
        return min(a[1], a[0])
    }

    max := min(a[n - 1], a[0]) * (n - 1)

    i := 0
    j := n - 1

    for i < j  {
        if a[i] < a[j] {
            i++
        }else {
            j--
        }

        area := min(a[i], a[j]) * (j - i)
        if area > max {
            max = area
        }
    }

    return max
}

func min(x, y int) int {
    if x < y {
        return x
    }

    return y
}

      结果:

      该算法能正常通过面试,祝大家获得自己心仪的offer.

      周末愉快。

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值