读题
题目难度:medium
给定一个非负整数数组,画柱状图。以数组第 i , j 位( i < j )对应的数值为桶壁,加上横轴形成一个盛水的容器。如图所示,水面的高度 =第 i , j 位两位对应数值中的最小值,宽度等于( j - i )。
题目11:
思路
我认为,盛放尽可能多的水,就要追求桶壁尽可能高,桶壁距离尽可能远。桶壁高度涉及到排序,桶壁距离免不了遍历。所以一时真想不到什么好方法。用暴力的方法做一下吧。
暴力解决版本一
一开始没有什么思路,先写了一个暴力的方法解决一下。用两层循环,依次比较,求出每次容器的容水量,记录最大值,复杂度为O(n^2)。代码如下:
class Solution {
public int maxArea(int[] height) {
int maxWater = 0;
int water = 0;
int n = height.length;
int minHeight = 0;
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++) {
minHeight = (height[i] < height[j]) ? height[i] : height[j];
water = minHeight * (j - i);
if (water > maxWater) {
maxWater = water;
}
}
return maxWater;
}
}
提交了一下,反馈的结果果然不怎么样。
暴力解决版本二
后来实在不知道该怎么修改,就在内存使用上改了改,少使用了两个变量,效果还提升了不少。代码如下:
class Solution {
public int maxArea(int[] height) {
int maxWater = 0;
int water = 0;
for (int i = 0; i < height.length; i++)
for (int j = i + 1; j < height.length; j++) {
water = ((height[i] < height[j]) ? height[i] : height[j]) * (j - i);
maxWater = (water > maxWater) ? water : maxWater;
}
return maxWater;
}
}
暴力第二版的反馈:
感想
先记录,再改进。