链接如下:
11. 盛最多水的容器
【解法】(对撞指针)
首先,初始时左指针指向数组的起始位置,右指针指向数组的结束位置。计算当前区间内的容器的盛水量,并更新最大盛水量。
接着,判断两个指针所指向的元素的高度,将较小的元素的指针向内移动一步。这样可以保证每次移动都在选择更高的边界线,以获得可能的更大盛水量。
重复上述步骤,直到两个指针相遇,即左指针大于等于右指针。此时遍历完成,返回最大盛水量。
【算法流程】
a.初始化最大盛水量 ret 为 0,左指针 left 指向数组起始位置,右指针 right 指向数组结束位置。
b.进入循环,判断条件为左指针小于右指针。
◦ 计算当前区间的宽度、最小高度以及当前盛水量。
◦ 更新最大盛水量,取当前盛水量与历史最大盛水量的较大值。
◦ 判断两个指针所指向元素的高度,将较小元素的指针向内移动一步。
c. 循环结束后,返回最大盛水量作为结果。
int main()
{
int n;
int ret = 0;
cin >> n;
vector<int>height(n, 0);
for (int i = 0; i < n; i++)
{
cin >> height[i];
}
int left = 0;
int right = n - 1;
while (left < right)
{
int width = right - left;
int minheight = min(height[left], height[right]);
ret = max(ret, width * minheight);
if (height[left] < height[right])
left++;
else
right--;
}
cout << ret << endl;
return 0;
}