首页 > 试题广场 >

盛水最多的容器

[编程题]盛水最多的容器
  • 热度指数:33242 时间限制: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
int maxArea(int* height, int heightLen ) {
    // write code here
    int res,i,*j,*heightMax,*heightLeft,*heightRight;
    if(heightLen<2)
        return 0;
   
    heightMax = height;
    for(i=0;i<heightLen;i++) {
        if(*heightMax<height[i])
            heightMax=&height[i];
    }
    heightLeft = heightMax;
    heightRight = heightMax;

    res = 0;
    for(i=heightMax-height,j=heightMax;i>0;i--) {
        long long volume;
        j--;
        volume = (*j) * (heightMax-j);
        if(res<volume) {
            res = volume;
            heightLeft = j;
        }
    }

    res = 0;
    for(i=heightMax-height,j=heightMax;i<heightLen-1;i++) {
        long long volume;
        j++;
        volume = (*j) * (j-heightMax);
        if(res<volume) {
            res = volume;
            heightRight = j;
        }
    }

    res = 0;
    for(i=heightRight-height,j=heightRight;i>0;i--) {
        long long volume;
        j--;
        volume = (*j>*heightRight?*heightRight:*j) * (heightRight-j);
        if(res<volume) {
            res = volume;
            heightLeft = j;
        }
    }

    res = 0;
    for(i=heightLeft-height,j=heightLeft;i<heightLen-1;i++) {
        long long volume;
        j++;
        volume = (*j>*heightLeft?*heightLeft:*j) * (j-heightLeft);
        if(res<volume) {
            res = volume;
            heightRight = j;
        }
    }

    res = (*heightLeft) * (heightMax-heightLeft);
    res = (*heightRight) * (heightRight-heightMax) > res ? (*heightRight) * (heightRight-heightMax) : res;
    res = (*heightLeft>*heightRight ? *heightRight: *heightLeft) * (heightRight-heightLeft) > res ? (*heightLeft>*heightRight ? *heightRight: *heightLeft) * (heightRight-heightLeft) : res;

    return res;
}

编辑于 2024-03-13 15:25:46 回复(0)

问题信息

上传者:牛客301499号
难度:
2条回答 3145浏览

热门推荐

通过挑战的用户

查看代码