用「单调栈」解决“攒青豆”这类现实生活问题

开发 前端
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)。

问题描述

攒青豆

现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)

图片

输入格式

输入每根柱子高度的数组

输出格式

输出一个整数,表示最大能接住多少青豆

输入样例:

[5,0,2,1,4,0,1,0,3]

输出样例:

17

解题思路

通过单调栈找到每根柱子左边第一个比它高的位置,把两根柱子之间的青豆数累加起来,栈内元素是成递减的顺序保存的。

  1. 首先比较当前栈顶元素是否小于当前柱子高度,如果小于栈顶就继续入栈,否则就要找到把栈弹出到第一个比当前柱子高的位置,栈内元素存的数组下标位置,所以可以通过当前下标值与之前的值相减得到宽度差
  2. 使用Last变量记录上一个弹出栈顶的元素高度,因为可以计算两个柱子之间的高度差,每次弹出柱子都要更新一次Last
  3. 最后判断栈是否为空,不空的话需要加上左边柱子比当前柱子高的之间大小

相关代码

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){
Stack<Integer> stack = 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」,可以通过以下二维码关注。

转载本文请联系「 程序员升级打怪之旅」公众号。

责任编辑:武晓燕 来源: 程序员升职加薪之旅
相关推荐

2022-06-05 23:59:31

加密货币区块链比特币

2019-05-14 13:14:24

智慧社区智能服务智能家居

2018-09-11 14:40:07

物联网应用物联网IOT

2023-03-30 08:10:31

Vue.js转换和微交互

2023-08-24 08:37:50

VueCSS

2015-09-21 09:20:55

2024-05-09 12:52:12

大数据

2020-06-04 08:06:12

物联网应用物联网IOT

2017-12-28 09:22:24

机器学习应用生活

2015-01-05 09:53:05

Java

2022-08-14 14:46:58

元宇宙Web3.0虚拟宇宙

2022-06-16 15:12:02

元宇宙房产虚构世界

2023-08-09 09:30:10

数组结构left )

2010-12-01 23:26:12

微软创新杯

2022-11-03 15:22:15

数据结构Python

2017-03-01 10:04:16

2018-04-08 09:07:58

2012-05-08 16:21:26

智能手机

2022-01-14 11:48:39

量子计算硬件技术

2023-05-29 07:31:35

单调栈数组循环
点赞
收藏

51CTO技术栈公众号