当青训营遇上码上掘金
-
主题 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 个单位的青豆。
解题思路:
题目有几种方式可以来解决,暴力方法,双指针等方法 ,本题我采用的是双指针的方式来解决问题。
1.暴力法
对于每个柱子,都从左向右去寻找比它高的柱子。计算这两个柱子围城的区域可以承受的最大豆子数目。
2.双指针方法(java版本)
首先找到整个柱子数组中最高的柱子,然后把柱子分为左右两个部分。
使用left和right来标记左右最左面和最右面 的柱子。
比较left和right所指向的柱子的高度,把指针移动到比较短的柱子的右面,移动的过程中,累计青豆的数目
最终的结果就是累计到的青豆数量。同时在移动过程中,不要忘记left++和right--。
代码是由java编写。
public static void main(String []args) {
int[] heights = new int[]{5,0,2,1,4,0,1,0,3};
int beanNum = 0;
int left = 1,right = heights.length - 2;
int leftMax = heights[0];
int rightMax = heights[right + 1];
while(left <= right){
leftMax = Math.max(leftMax,heights[left]);
rightMax = Math.max(rightMax,heights[right]);
if(leftMax > rightMax){
beanNum += rightMax - heights[right];
right--;
}else{
beanNum += leftMax = heights[left];
left++;
}
}
System.out.println("青豆数"+beanNum);
}
}