• 盛最多水的容器


    给定 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

  • 相关阅读:
    APP的LOGO设计需求
    App 中使用 Iconfont 的整套方案
    UI流程总结
    sketch制作LOGO(一)---环形光晕
    Sketch插件--Rename It
    Sketch Measure使用教程
    04 流程控制
    03 python语法注释、用户交互、格式化输出、基本数据类型、运算符
    02编程语言及python初识
    第一课
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/8921683.html
Copyright © 2020-2023  润新知