LeetCode 11. 盛最多水的容器(Container With Most Water)

 

题目描述

 

给定 n 个非负整数 a1a2,...,an,每一个数表明坐标中的一个点 (iai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (iai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器能够容纳最多的水。数组

注意:你不能倾斜容器,n 至少是2。spa

 

解题思路

 

考虑用双指针法解题。维护两个指针f、l分别指向数组左右两端,则f和l构成的容器盛水体积计算公式为min(height[f],height[l])*(l-f)。能够看出盛水体积取决于容器边中较小的数字和容器底长度。若移动较大的数字,则容器底长度会变小,而盛水的最大高度不变,因此盛水体积不会变动大。所以须要移动两数中较小的数字,这样若中间出现特别大的数字,则有可能提升盛水体积。而后每次移动完更新此时的最大盛水体积,直到两指针相遇。指针

 

代码

 

 1 class Solution {  2 public:  3     int maxArea(vector<int>& height) {  4         int f=0,l=height.size()-1;  5         int maxA=-1;  6         while(f<l){  7             int area=min(height[f],height[l])*(l-f);  8             if(area>maxA)  9                 maxA=area; 10             if(height[f]<height[l]) 11                 f++; 12             else l--; 13  } 14         return maxA; 15  } 16 };
相关文章
相关标签/搜索