当青训营遇上码上掘金
题目:主题 4:攒青豆
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
输入:height = [5,0,2,1,4,0,1,0,3] 输出:17 解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
思路:
求青豆个数的题目,可以使用暴力枚举的思想,对于每一列的柱子,向左和向右扩展,直到遇到比它高的柱子,计算出这个矩形的面积。
但是这种暴力枚举的方式时间复杂度是 O(n^2),时间效率较低。
可以使用优化的思想,在枚举每一列的柱子的时候,维护每一列向左和向右的最大值,从而提高算法效率。
利用这种方式实现的代码时间复杂度是 O(n),时间效率较高。
接下来看看实现的代码
class Solution {
public int trap(int[] height) {
int res = 0;
int[] maxLeft = new int[height.length];
int[] maxRight = new int[height.length];
for (int i = 1; i < height.length; i++) {
maxLeft[i] = Math.max(maxLeft[i - 1], height[i - 1]);
}
for (int i = height.length - 2; i >= 0; i--) {
maxRight[i] = Math.max(maxRight[i + 1], height[i + 1]);
}
for (int i = 0; i < height.length; i++) {
res += Math.min(maxLeft[i], maxRight[i]) - height[i];
}
return res;
}
}
可以看到通过这种方式实现的代码时间复杂度是 O(n),比起暴力破解的方式时间复杂度O(n^2),提高了时间复杂度。
具体代码测试完整的实例可以通过马上掘金看到,见链接code.juejin.cn/pen/7199126…
这次题目看似是在求青豆数量,实则可以转化为求矩形面积