力扣 11 盛最多水的容器

力扣 11 盛最多水的容器

题目

给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。
在这里插入图片描述

示例:

输入: [1,8,6,2,5,4,8,3,7]
输出: 49



思路

从两端出发,用left指向最左,right指向最右,这样可以保证面积的横轴差值是最大的。
maxArea_记录最初始的面积大小,之后比较左右边纵坐标的大小,移动较小的一边,(左边的纵坐标小则left++,右边的纵坐标小则right–)
理由:因为面积的纵轴最终选取的是左右两个点纵轴的最小值,例如现在输入的是[1,8,3,7]
left=0, height[left]=1;
right=3,height[right]=7;
因为此时横坐标的差值最大,因为height[left]是小的,那么无论right怎么移动,最终选取的纵坐标都是<=height[left],所有只有移动纵坐标较小的一端,才能保证在横坐标差减小的情况下面积反而变大。

class Solution {
public:
	int maxArea(vector<int>& height) {
		int left = 0, right = height.size() - 1;
		int maxArea_ = (right - left) * min(height[left], height[right]);
		while (left < right)
		{
			maxArea_ = max(maxArea_ , (right - left)* min(height[left], height[right]));
			if (height[left] > height[right]) right--;
			else left++;
		}
		return maxArea_;
	}
};
	


最后执行结果

在这里插入图片描述

发布了15 篇原创文章 · 获赞 1 · 访问量 300

猜你喜欢

转载自blog.csdn.net/Janna_woo/article/details/103941859