网站宣传与推广百度推广电话销售好做吗
一、题目
11. 盛最多水的容器
给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。你不能倾斜容器。
二、思路
容纳最多的水——(j-i) * min(height[i], height[j])取到最大值
如果直接遍历下去,要比较的次数太多了(也就是指针移动的次数太多了),怎么办呢?
我们要找到简化比较过程的一个规律,可以利用最大储水量依赖的容器高来判断指针如何移动:
1. 初始化两个指针:left
指向数组的开头,right
指向数组的末尾。
2. 初始化最大水量:most
用于存储最大的水量。
3. 循环条件:当 left
小于 right
时,继续循环。
4. 计算当前水量:
h
是两个高度中的较小值。width
是两个指针之间的距离。water
是当前容器可以容纳的水量。
5. 更新最大水量:用 Math.max
更新 most
。
6. 移动指针:
- 如果
height[left]
小于height[right]
,增加left
指针。 - 否则,减小
right
指针。
7. 返回最大水量:在循环结束后返回 most
。
三、代码
① JavaScript:
function mostWater(height) {let left = 0;let right = height.length - 1;let most = 0;while (left < right) {const h = Math.min(height[left], height[right]);const width = right - left;const water = h * width;most = Math.max(most, water);if (height[left] < height[right]) {left++;} else {right--;}}return most;
};
② python:
def most_water(height):left = 0right = len(height) - 1most = 0while left < right:h = min(height[left], height[right])width = right - leftwater = h * widthif water > most:most = waterif height[left] < height[right]:left += 1else:right -= 1return most
③ C++:
int mostWater(const vector<int>& height) {int left = 0;int right = height.size() - 1;int most = 0;while (left < right) {int h = min(height[left], height[right]);int width = right - left;int water = h * width;if (water > most) {most = water;}if (height[left] < height[right]) {left++;} else {right--;}}return most;
}
四、反思
上面的代码与下面自己写的代码相比,直接用max方法处理了most和water的判断,简化了步骤,学习!