解决LEET代码上的“大多数水容器”问题
#编程 #编码 #java #developers

11.大多数水的容器

类型:中等
喜欢: 26.5k
不喜欢: 1.4K

问这个问题的公司
公司:没有时间问

Microsoft 4
Google 4
亚马逊3
Adobe 2
彭博2
苹果9
Facebook 4
Uber 3
Oracle 2
Teltok 2
高盛5
英特尔4
Swiggy 4
绑定3
VMware 3
Qualtrics 3
Intuit 3
Flipkart 2
Zoho 2
三星2
eBay 2
沃尔玛实验室2
Yandex 2
雅虎2
思科2
TCS 2
特斯拉2
C3物联网2
Arcesium 2
肖2
jpmorgan 2
Wix 1

您获得了一个长度为n的整数height。有n个垂直线,使得ith线的两个endpoints(i, 0)(i, height[i]).
找到与X轴一起形成一个容器的两条线,使容器中包含最多的水。
返回容器可以存储的最大水量。
请注意,您可能不会倾斜容器。

示例2:
输入:高度= [1,8,6,2,5,4,8,3,7]
输出:49
说明:The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.

示例2:
输入:高度= [1,1]
输出:1

直觉:

代码旨在在直方图中找到两条线之间的最大区域,其中线代表条形的高度。

方法:

  • 在直方图的两端初始化指针(在0和最后一个元素处的左POINTER)。
  • 左Pointer小于右Pointer:
  • 计算左pointer和右pointer在高度形成的线之间的区域。
  • 如果当前区域更大。
  • 将指向向内较短线的指针移动(向其他指针)。
  • 重复步骤2直到指针相遇。

复杂:

时间复杂度: o(n),其中n是高度阵列中的元素数。我们曾经迭代阵列一次。
空间复杂性: o(1),因为我们使用恒定量的额外空间,而不论输入大小如何。

代码:

class Solution {
    public int maxArea(int[] height) {
        int MaximumArea = 0;
        int LeftPointer = 0;
        int RightPointer = height.length - 1;

        while(LeftPointer < RightPointer){
            if(height[LeftPointer] < height[RightPointer]){
                MaximumArea = Math.max(MaximumArea , height[LeftPointer] *(RightPointer - LeftPointer));
                LeftPointer++;
            }
            else{
                MaximumArea = Math.max(MaximumArea ,height[RightPointer] *(RightPointer - LeftPointer));
                RightPointer--;
            }
        }

        return MaximumArea;
    }
}

愉快的编码,
湿婆