读题心路历程:这道题,我感觉其实就是算矩形的最大面积,这个矩形中,数组中的数字为一条边,然后另一条边一定要大于等于这条边,然后再由这两条边在数组中的下标差为矩形的另一条边,然后求出这个数组可以组成矩形的最大面积。所以自然而然的想到了,用 i 和 j 分别表示两条变的位置,然后用 j-i 来表示一条边,用 j 或者 i 中最小的边,表示矩形的另一条边,乘起来就是矩形面积了,然后在遍历过程中,找到最大的就行。
代码:
int maxArea(vector<int>& height) {
//利用类似双指针的方法,首尾分别定义 i 和 j
int i = 0;
int j = height.size() - 1;
int maxArea = 0;
//仔细想一下,在移动双指针的时候,每次都要比较 height[i] 和 height[j] 的大小的,所以不需要让 i 移动完一整个数组的,移动一半之后,只需要当 i >= j 的时候停止计算就可以了。
while (i<j)
{
if (height[i] > height[j])
{
maxArea = max(maxArea, height[j] * (j - i));//这块的话,肯定要谁小去移动哪个指针的,因为,移动大的之后,j-i 肯定就更小了,所以矩形肯定会更小了。
j--;
}
else {
maxArea = max(maxArea, height[i] * (j - i));
i++;
}
}
return maxArea;
}