zoukankan      html  css  js  c++  java
  • 盛最多水的容器

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

    注意:你不能倾斜容器,n 至少是2。

    首先需要指出的是该问题描述不清晰,两条线与x轴如何能构成一个容器,以x轴为直径的圆为底,两条线较短者为高构成一个容器?

    看了下LeetCode上的解答,都是计算两条线与x轴构成最大的面积。如下内容也是按照计算最大面积求解。

    对于(i, ai)  、 (j, aj)与x轴构成的面积area=(j-i) * min(ai, aj)

    数组height存储了每个点,height[i]代表(i, ai)

    求解放法:

    可以选择两个指针p,q分别指向height的前后两个节点      maxArea=(q-p) * Math.min(height[p], height[q])

    若height[p]>height[q] 就移动q使q减1,  这是由于若移动p(p++),则新得到的area一定小于上步,(q-p)减小了1,min(height[p],height[q])也小于等于上步。

    反之p++

    代码如下:

        public static int maxArea(int[] height) {
    
            int p = 0;
            int q = height.length - 1;
            int maxArea = 0;
    
            int temp;
            while (p<q) {
                temp = (q-p)*Math.min(height[p], height[q]);
                maxArea = maxArea>temp?maxArea:temp;
                if (height[p]<height[q]) p++;
                else q--;
            }
            return maxArea;
        }

    备注:

    最大面积并不一定是最大容量,如果按照最大容量计算,maxCapacity = pi*(q-p)/2*(q-p)/2 * min(height[p], height[q])

    上述方法依然可行,只需将maxArea 改为 double型的maxCapacity

  • 相关阅读:
    windows程序设计笔记(11)
    windows程序设计笔记(8)
    windows程序设计笔记(9)
    windows程序设计笔记(7)
    [转]学习训练方法
    CA面试题
    windows程序设计笔记(10)
    C#线程系列(3):线程池和文件下载服务器
    Linq 使用小结
    C#线程系列(2):Thread类的应用
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/8921683.html
Copyright © 2011-2022 走看看