[力扣c语言实现]11. 盛最多水的容器

11. 盛最多水的容器

1. 题目描述

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:

输入:height = [1,1]
输出:1
示例 3:

输入:height = [4,3,2,1,4]
输出:16
示例 4:

输入:height = [1,2,1]
输出:2

提示:
n = height.length
2 <= n <= 3 * 104
0 <= height[i] <= 3 * 104

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/container-with-most-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.代码如下

#define max(a,b) ((a) > (b)?(a):(b))
#define min(a,b) ((a) < (b)?(a):(b))

int maxArea(int* height, int heightSize){
    
    
    int i = 0,j = heightSize - 1;
    int ret = 0;

    while (i < j)
    {
    
    
        ret = max(ret,min(height[i],height[j])*(j-i));
        height[i] < height[j]?i++:j--;
    }

    return ret;
}

/*
这种做法没有遍历所有的区间就能得到最大值,为什么呢?

这里用到了动态规划,基本的表达式: area = min(height[i], height[j]) * (j - i) 
使用两个指针,值小的指针向内移动,这样就减小了搜索空间,因为面积取决于指针的距离与值小的值乘积,
如果值大的值向内移动,距离一定减小,而求面积的另外一个乘数一定小于等于值小的值,
因此面积一定减小,而我们要求最大的面积,因此值大的指针不动,而值小的指针向内移动遍历

*/

猜你喜欢

转载自blog.csdn.net/dengwodaer/article/details/114295448