首页 > 试题广场 >

盛水最多的容器

[编程题]盛水最多的容器
  • 热度指数:33412 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个数组height,长度为n,每个数代表坐标轴中的一个点的高度,height[i]是在第i点的高度,请问,从中选2个高度与x轴组成的容器最多能容纳多少水
1.你不能倾斜容器
2.当n小于2时,视为不能形成容器,请返回0
3.数据保证能容纳最多的水不会超过整形范围,即不会超过231-1

数据范围:


如输入的height为[1,7,3,2,4,5,8,2,7],那么如下图:


示例1

输入

[1,7,3,2,4,5,8,2,7]

输出

49
示例2

输入

[2,2]

输出

2
示例3

输入

[5,4,3,2,1,5]

输出

25
package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param height int整型一维数组
 * @return int整型
 */
func maxArea( height []int ) int {
    // write code here
    if len(height) < 1 {return 0}

    res, l, r := 0, 0, len(height) - 1
    for l < r {
        res = getMax(res, getMin(height[l], height[r]) * (r - l))
        if height[l] <= height[r] {
            l ++
        } else {
            r --
        }
    }
    return res
}

func getMin(l, r int) int {
    if l <= r {
        return l
    }
    return r
}

func getMax(res, tmp int) int {
    if res < tmp {
        return tmp
    }
    return res
}

编辑于 2024-03-06 02:45:03 回复(0)
package main
// import "fmt"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param height int整型一维数组 
 * @return int整型
*/
func maxArea( height []int ) int {
    ans:=0
    i,j:=0,len(height)-1
    for i<j{
        v:=min(height[j],height[i])*(j-i)
        if v>ans{
            ans=v
        }
        if height[i]<height[j]{
            i++
        }else{
            j--
        }
    }
    return ans
}

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

发表于 2023-02-09 02:00:31 回复(0)
package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param height int整型一维数组 
 * @return int整型
*/
func maxArea( height []int ) int {
    if len(height) < 2 {
        return 0
    }
    
    // 左右双指针对比
    left, right := 0, len(height)-1
    res := 0
    for left < right {
        //计算当前面积, 对比得到最大面积
        area := min(height[left], height[right]) * (right-left)
        res = max(res, area)
        // 最短的边内移动
        if height[left] < height[right] {
            left++
        } else {
            right--
        }
    }
    return res
}

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
}

发表于 2022-09-10 10:40:31 回复(0)
双指针
func maxArea( height []int ) (max int) {
    left, right, tmp := 0, len(height)-1, 0
    for left < right {
        if lh, rh, dep := height[left], height[right], right - left; lh < rh {
            tmp = lh * dep
            left++
        } else {
            tmp = rh * dep
            right--
        }
        if max < tmp {max = tmp}
    }
    return
}

发表于 2021-11-26 15:20:26 回复(0)