目录
题目
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。
在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1]
输出:1
代码思路
1、暴力求解
时间复杂度:O(N^2)
空间复杂度:O(1)
(以整形数组heigh[] = [1,8,6,2,5,4,8,3,7]为例)
用数组第一个数据1与其他的数据逐个计算,记录最大的值,然后用数组第二个数据做同样的操作,然后与第一次计算的最大值比较,得到较大的值用于下次比较,然后重复操作即可。
注:此题用此方法的时间复杂度过高,不能通过。
2、双指针
时间复杂度:O(N)
空间复杂度:O(1)
(以整形数组heigh[] = [6,1,5,2]为例)
我们用两个自变量记录数组两边的值,若我们将数值高的变量向数值低的变量移动,我们可以发现结果越来越小或不变,若我们将数值低的变量向数值高的变量移动呢?
我们可以发现会出现最大值,如果数组变长一点可能会有跟多的情况,我们可以记录每次移动的结果与上一次比较就可以得到最大的值。
代码实现
class Solution
{
public:
int maxArea(vector<int>& height)
{
//得到数组左右两边的数据
int left = 0, right = height.size() - 1;
int ret = 0;
while(left < right)
{
//取最小的值作为高与它们之间的距离相乘
int v = min(height[left], height[right]) * (right - left);
//得到较大的结果
ret = max(ret, v);
//判断左右哪边移动
if(height[left] < height[right])
left++;
else
right--;
}
return ret;
}
};
标签:11,right,复杂度,ret,height,数组,最多水,LeetCode,left
From: https://blog.csdn.net/Another_Shi/article/details/141938070