解题思路:

给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

1973.png

--------------------- 

作者:老表Pro 

来源:CSDN 

原文:https://blog.csdn.net/qq_39241986/article/details/83577857 

版权声明:本文为博主原创文章,转载请附上博文链接!


我们需要定义i和j两个指针分别指向数组的左右两端,然后两个指针向中间搜索,每移动一次算一个值和结果比较取较大的,容器装水量的算法是找出左右两个边缘中较小的那个乘以两边缘的距离,代码如下:

C++ 解法一:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int res = 0, i = 0, j = height.size() - 1;
        while (i < j) {
            res = max(res, min(height[i], height[j]) * (j - i));
            height[i] < height[j] ? ++i : --j;
        }
        return res;
    }
};

下面这种方法是对上面的方法进行了小幅度的优化,对于相同的高度们直接移动i和j就行了,不再进行计算容量了,参见代码如下:

C++ 解法二:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int res = 0, i = 0, j = height.size() - 1;
        while (i < j) {
            int h = min(height[i], height[j]);
            res = max(res, h * (j - i));
            while (i < j && h == height[i]) ++i;
            while (i < j && h == height[j]) --j;
        }
        return res;
    }
};

--------------------- 

作者:Grandyang 

来源:博客园 

原文:https://www.cnblogs.com/grandyang/p/4455109.html

注意事项:

如果以上解法很难读懂,可以试着先不用vector,只用一个足够大的数组获取输入、并暴力地遍历任何“两条直线”所构成容器以较短边为准可容纳的水量,找到最大值。
参考代码:

#include<stdio.h>
int a[100000];
int max(int a,int b){
    // 返回a和b中较大的值
}
int min(int a,int b){
    // 返回a和b中较小的值
}
int main(){
    int i,j,n=1,res=0;
    while(~scanf("%d",a+n)) n++;
    n--;
    for(i=1;i<=n-1;i++)
        for(j=i+1;j<=n;j++)
            res=max(res,(j-i)*min(a[i],a[j]));
    printf("%d\n",res);
    return 0;
}


点赞(1)
 

0.0分

5 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论