跳到主要内容

11. 盛水最多的容器

1. 直接遍历

  • 时间复杂度 O(n^2)

2. 从两边向中间遍历

  • 每次向内移动较矮边,如果新面积更大,则保存新面积,直到左右指针相遇
  • 时间复杂度 O(n)
int maxArea(std::vector<int> &height) {
auto leftIter = height.begin();
auto rightIter = height.end() - 1;
auto *lowerIter = &leftIter;
auto step = 0;
auto output = -1;
auto outputTmp = -1;
while (leftIter != rightIter) {
lowerIter = *leftIter.base() < *rightIter.base() ? &leftIter : &rightIter;
step = *leftIter.base() < *rightIter.base() ? 1 : -1;
outputTmp = *lowerIter->base() * (rightIter - leftIter);
if (outputTmp > output)
{
output = outputTmp;
}
*lowerIter += step;
}
return output;
}

* Your runtime beats 5.31 % of cpp submissions
* Your memory usage beats 5.02 % of cpp submissions (57.9 MB)

优化项

  1. 可使用 max 代替 if
  2. 添加判断,如果下一个比上一个的最小值小,则不需要计算面积,直接下一个