题目如图:
最开始暴力求解:
public static int CalculateMaxArea(int[] height) {
int length = height.Length;
int area = 0;
//暴力法,从前往后遍历,计算每个数值和分别和其后的数值组成的区域面积,取最大值
for (int i = 0; i < length; i++) {
for (int j = length - 1; j > i; j--) {
area = Math.Max(area, (j - i) * Math.Min(height[i], height[j]));
}
}
return area;
}
后来优化了一下:
public static int CalculateMaxArea(int[] height) {
int length = height.Length;
int area = 0;
//从两端开始向中间遍历,取两端数值小的向中间靠近,直至遍历所有数,取最大值
int idx = 0, idy = height.Length - 1;
while (idx < idy) {
if (height[idx] > height[idy]) {
area = Math.Max(area, (idy - idx) * height[idy]);
idy--;
}
else {
area = Math.Max(area, (idy - idx) * height[idx]);
idx++;
}
}
return area;
}