|
| 1 | +/* |
| 2 | + * @Author: Chacha |
| 3 | + * @Date: 2022-04-01 21:20:42 |
| 4 | + * @Last Modified by: Chacha |
| 5 | + * @Last Modified time: 2022-04-01 22:04:58 |
| 6 | + */ |
| 7 | + |
| 8 | +/** |
| 9 | + * |
| 10 | + * 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 |
| 11 | + * 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。 |
| 12 | + * |
| 13 | + * 输入:height = [1,8,6,2,5,4,8,3,7] |
| 14 | + * 输出:49 |
| 15 | + * 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。 |
| 16 | + * |
| 17 | + * 示例 2: |
| 18 | + * 输入:height = [1,1] |
| 19 | + * 输出:1 |
| 20 | + * |
| 21 | + * 提示: |
| 22 | + * 1. n == height.length |
| 23 | + * 2. 2 <= n <= 105 |
| 24 | + * 3. 0 <= height[i] <= 104 |
| 25 | + * |
| 26 | + */ |
| 27 | + |
| 28 | +#include <vector> |
| 29 | +#include <iostream> |
| 30 | +#include <math.h> |
| 31 | + |
| 32 | +using namespace std; |
| 33 | + |
| 34 | +class Solution |
| 35 | +{ |
| 36 | +private: |
| 37 | + /* data */ |
| 38 | +public: |
| 39 | + int maxArea(vector<int> &height); |
| 40 | +}; |
| 41 | + |
| 42 | +/** |
| 43 | + * 双指针法 |
| 44 | + * 设两指针i,j,指向的水槽板高度分别为 h[i],h[j],此状态下水槽面积S(i, j)。 |
| 45 | + * 由于可容纳水的高度由两板中的 短板 决定,因此可得如下 面积公式 : |
| 46 | + * S(i, j) = min(h[i], h[j]) × (j − i) |
| 47 | + * |
| 48 | + * 在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽 底边宽度 −1 变短: |
| 49 | + * 1. 若向内移动短板,水槽的短板 min(h[i], h[j]) 可能变大,因此下个水槽的面积可能增大。 |
| 50 | + * 2. 若向内移动长板,水槽的短板 min(h[i], h[j]) 不变或变小,因此下个水槽的面积 一定变小。 |
| 51 | + * |
| 52 | + * 因此,初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两个指针相遇时跳出,即可获得最大面积 |
| 53 | + * |
| 54 | + * 算法步骤: |
| 55 | + * 1. 初始化:双指针 i, j 分列水槽左右两端 |
| 56 | + * 2. 循环收窄:直至双指针相遇时跳出 |
| 57 | + * a. 更新面积最大值 ans |
| 58 | + * b. 选定两板高度中的短板,向中间收窄一格 |
| 59 | + * 3. 返回面积最大值 ans 即可 |
| 60 | + * |
| 61 | + */ |
| 62 | +int Solution::maxArea(vector<int> &height) |
| 63 | +{ |
| 64 | + int i = 0, j = height.size() - 1; |
| 65 | + int ans = 0; |
| 66 | + |
| 67 | + while (i < j) |
| 68 | + { |
| 69 | + ans = height[i] < height[j] ? max(ans, (j - i) * height[i++]) : max(ans, (j - i) * height[j--]); |
| 70 | + } |
| 71 | + |
| 72 | + return ans; |
| 73 | +}; |
| 74 | + |
| 75 | +int main(int argc, char const *argv[]) |
| 76 | +{ |
| 77 | + Solution s; |
| 78 | + |
| 79 | + vector<int> height = {1, 8, 6, 2, 5, 4, 8, 3, 7}; |
| 80 | + |
| 81 | + cout |
| 82 | + << "输入:[1,8,6,2,5,4,8,3,7] 输出:" << s.maxArea(height) << endl; |
| 83 | + |
| 84 | + return 0; |
| 85 | +} |
0 commit comments