11:盛最多水的容器(C++)
题目地址:https://leetcode-cn.com/problems/container-with-most-water/
题目描述
给你 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
解题思路
思路1:暴力。枚举左右柱子left和right所围成的面积,计算面积area=(y-x)*hegiht_dff,其中高度差height_diff=min(height[x], height[y]),返回最大面积值即可。可惜超时,时间复杂度O(n^2);
思路2:左右夹逼。左右柱子left和right向中间收敛,如果左指针代表的左柱子高度较小,移动左指针向右,即left++,否则,移动右指针向左,即right--,当然了,如果左右柱子高度相等,则将左右柱子同时向中间移动一步。因为只需要遍历一遍数组,所以时间复杂度为O(n)。类似题目,还有167、240。
程序源码
思路1:超时
class Solution { public: int maxArea(vector<int>& height) { if(height.size() < 2) return 0; int area = 0; for(int left = 0; left < height.size() - 1; left++) { for(int right = left + 1; right < height.size(); right++) { area = max(area, (right - left)*min(height[left], height[right])); } } return area; } };
思路2
class Solution { public: int maxArea(vector<int>& height) { if(height.size() < 2) return 0; int area = 0; int left = 0, right = height.size() - 1; while(left < right) { int minHeight = height[left] < height[right]? height[left++]:height[right--]; area = max(area, (right - left + 1)*minHeight); } return area; } };
-----------------------------------
心之所向,素履所往;生如逆旅,一苇以航。
------------------------------------------