题目
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为2.
示例:
输入: [1,8,6,2,5,4,8,3,7]
输出: 49
思路
双指针法(下文将height[i]简写为h[i]):
根据本示例,
Step1:计算h[0]与h[8],即首相与末项组成的面积
Step2:若h[0]<h[8],则计算h[1]与h[8]组成的面积;否则计算h[0]与h[7]的面积(保留大数)
Step3:比较h[1]与h[8]的大小(或h[0]与h[7]),根据Step2的保留大数原则进行取舍,重复上述规则,直到进行比较的是两个相邻项,那么这个过程中算出的最大的面积即为所求。
合理性:为什么若h[0]<h[8], Step2能跳过h[0]与h[7]的面积?
根据短板原理,
h[0]与h[8],组成的面积: 8min(h[0],h[8])=8h[0] (1)
h[0]与h[7],组成的面积: 7min(h[0],h[8])=7h[0] (2)
故(1)>(2),不用再计算(2)
代码
public class Solution {
public int MaxArea(int[] height) {
int len = height.Length;
int start = 0;
int end = len - 1;
int Max = int.MinValue;
while(start<end)
{
int S = (end - start) * Math.Min(height[start], height[end]);
if(S>Max)
{
Max = S;
}
if (height[start] > height[end]) { end--; }
else { start++; }
}
return Max;
}
}
实验结果
执行用时 :152 ms, 在所有 C# 提交中击败了91.23%的用户 内存消耗 :26.8 MB, 在所有 C#提交中击败了5.45%的用户