LeetCode 热题100 11. 盛最多水的容器

题目:

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

示例:

(图片源自:https://leetcode.cn/problems/container-with-most-water/)

 

解析:

面积等于x轴坐标差,乘以较小的y轴坐标,如上图所示,面积就是(9-2)*7=49

这里用两个指针i, j 分别指向水槽的两个边,用h[i]和h[j]表示高度,因此面积就是 min(h[i], h[j]) * (j-i)  这里考虑以下两种情况:

当较长的板向内移动时,横坐标肯定是减少的,而水槽的高度是由短板决定的,因此min(h[i], h[j])可能会不变或者减少,因此移动后的水槽面积一定变小

当较短的板向内移动时,min(h[i], h[j])可能变大,因此面积可能增大

因此,初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。

代码:

 1 class Solution {
 2 public:
 3     int maxArea(vector<int>& height) {
 4         int i=0, j=height.size()-1;
 5         int res=0;
 6         while(i<j){
 7             res=max(min(height[i],height[j])*(j-i),res);
 8             if(height[i]<=height[j]) i++;
 9             else j--;
10         }
11         return res;
12     }
13 };

 

posted @ 2022-06-19 13:17  Tiancfq  阅读(36)  评论(0编辑  收藏  举报