现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
输入每根柱子高度的数组
输出一个整数,表示最大能接住多少青豆
[5,0,2,1,4,0,1,0,3]
17
通过单调栈找到每根柱子左边第一个比它高的位置,把两根柱子之间的青豆数累加起来,栈内元素是成递减的顺序保存的。
import java.util.*;
public class Main{
public static void main(String[] args){
int[] height = new int[]{5,0,2,1,4,0,1,0,3};
System.out.println(qingdou(height));
}
static int qingdou(int[] w){
Stackstack = new Stack<>();
int res = 0;
//单调栈
for(int i = 0; i < w.length; i++){
int last = 0; //上一个栈顶元素
while(!stack.empty() && w[stack.peek()] <= w[i]){
res += (w[stack.peek()] - last) * (i - stack.peek() - 1);
last = w[stack.peek()];
stack.pop();
}
if(!stack.empty()) {
res += (w[i] - last) * (i - stack.peek() - 1);
}
stack.push(i);
}
return res;
}
}
访问下方链接可以直接在线运行:https://1024code.com/codecubes/KzFluKB
今天主要分享了对攒青豆的题目理解,有错误的地方欢迎大家指出,共同进步!!
本文转载自微信公众号「 程序员升级打怪之旅」,作者「王中阳Go」,可以通过以下二维码关注。
转载本文请联系「 程序员升级打怪之旅」公众号。
网站栏目:用「单调栈」解决“攒青豆”这类现实生活问题
分享地址:http://www.mswzjz.cn/qtweb/news44/375344.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能