循环操作每个木板,维护一个从栈底到栈顶单调递减的单调栈。

具体算法如下:先输入第i块木板的高度,然后标记下模板编号,记录到变量temp里。接着,temp依次和栈顶元素a比较,如果a的高度小于等于temp的高度,则弹出。

根据单调栈的性质,元素a出栈表明我们已经找到元素a右侧第一个比它大的元素了(这里指的就是temp),元素temp和元素a之间隔的元素个数等于temp的编号减去a的编号再减1,累加结果后我们进行新的比较,重复上述操作,知道栈顶元素的高度大于temp的高度,然后我们再把temp加入栈里。

循环结束后,我们还需要判断栈是否为空,如果不为空,则依次弹出栈顶元素,操作和上面的一样,最后输出结果,算法结束。

#include <stdio.h>
#include <stdlib.h>#define ERROR 0
#define OK 1typedef struct Node {int id, height;
} Node;typedef struct Stack {Node *elements;int max_size, top_index;
} Stack;void init(Stack *s, int length) {s->elements = (Node *)malloc(sizeof(Node) * length);s->max_size = length;s->top_index = -1;
}int push(Stack *s, Node element) {if (s->top_index >= s->max_size - 1) {return ERROR;}s->top_index++;s->elements[s->top_index] = element;return OK;
}int pop(Stack *s) {if (s->top_index < 0) {return ERROR;}s->top_index--;return OK;
}Node top(Stack *s) {return s->elements[s->top_index];
}int empty(Stack *s) {if (s->top_index < 0) {return 1;} else {return 0;}
}void clear(Stack *s) {free(s->elements);free(s);
}int main() {int n, ans = 0;scanf("%d", &n);Stack *stack = (Stack *)malloc(sizeof(Stack));init(stack, n);Node temp;for (int i = 1; i <= n; i++) {scanf("%d", &temp.height);temp.id = i;while (!empty(stack) && top(stack).height <= temp.height) {ans = ans + i - top(stack).id - 1;pop(stack);}push(stack, temp);}while (!empty(stack)) {ans = ans + n + 1 - top(stack).id - 1;pop(stack);}printf("%d\n", ans);clear(stack);return 0;
}

单调栈解木板倒水问题相关推荐

  1. 单调栈解木板倒水问题(单调栈的简单应用)

    题目描述: 地上从左到右竖立着 n 块木板,从 1 到 n 依次编号,如下图所示.我们知道每块木板的高度,在第 n 块木板右侧竖立着一块高度无限大的木板,现对每块木板依次做如下的操作:对于第 i 块木 ...

  2. 单调不减序列查询第一个大于等于_[力扣84,85] 单调栈

    题目链接 84. 柱状图中最大的矩形 85. 最大矩形 题目描述-84 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最 ...

  3. poj 2769 感觉♂良好 (单调栈)

    poj 2769 感觉♂良好 (单调栈) 比尔正在研发一种关于人类情感的新数学理论.他最近致力于研究一个日子的好坏,如何影响人们对某个时期的回忆. 比尔为人的一天赋予了一个正整数值. 比尔称这个值为当 ...

  4. leetcode84- 柱状图中最大的矩形(三种思路:暴力,单调栈+哨兵(详解),分治)

    leetcode84- 柱状图中最大的矩形(三种思路:暴力,单调栈+哨兵(详解),分治) 介绍 题目 解题思路 解法一:暴力向两边搜索 解法二:单调栈 画图演示 宽度计算: 解法三:单调栈+哨兵 解法 ...

  5. 【数据结构】单调栈和单调队列 详解+例题剖析

    算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...

  6. leetcode 581. 最短无序连续子数组(详解普通 / 进阶 / 单调栈解法,Java版)

    题目 题解 方法1(暴力排序):时间复杂度O(nlogn),空间复杂度O(n) 一个简单的想法是:将数组 nums 进行排序,记为 nums_sorted .然后比较 nums 和 nums_sort ...

  7. 单调栈图文详解(附Java模板)

    啥是"单调栈",它能解决什么样的问题?

  8. 算法学习 (门徒计划)4-2 单调栈(Monotone-Stack)及经典问题 学习笔记

    算法学习 (门徒计划)4-2 单调栈(Monotone-Stack)及经典问题 学习笔记 前言 单调栈 基础 性质 代码实现 总结 经典例题 LeetCode 155. 最小栈 (基础) 解题思路 L ...

  9. leetcode 739. 每日温度 单调栈解法和暴力法及其优化 c代码

    如题: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高, 请在该位置用 0 来代替.例如,给定一个列表 temperature ...

最新文章

  1. DFS:深入优先搜索 POJ-2386 Lake Counting
  2. 单元测试框架怎么搭?快来看看新版Junit5的这些神奇之处吧!
  3. SAP HUM事务代码HUMO里显示内层和外层HU信息
  4. 机器学习平台跃迁,AI中台才是大势所趋
  5. 远程值守_北京静态交通公司首个远程值守停车场投入使用
  6. python 获取指定目录下的图片文件
  7. 利用正则表达式提取网页中Table内的数据
  8. 最近用的几个sql语句
  9. redis mysql windows_Redis+Mysql模式和内存+硬盘模式的异同
  10. 【java笔记】接口的定义,接口的使用
  11. 电脑如设置路由器WiFi外加无线桥接一个副路由器
  12. 微信代金券--免充值代金券创建、激活、发放,查看详情
  13. 微信发朋友圈功能测试点小结
  14. 快商通智能客服云平台、金融反欺诈方案获中科院互联网周刊金i奖
  15. 入侵检测系统(IDS)分类
  16. 如何判断一个APP页面是原生的还是H5页面
  17. SpringWeb项目Maven执行clean命令后编译拒绝访问的解决方法
  18. 华为鸿蒙系统支持19款机型 有你的手机吗,华为鸿蒙OS再生变数,首批只有19款机型可升级,有你的手机吗?...
  19. 如何用AI设计一幅杂志封面
  20. echarts saveAsImage提示字显示不全

热门文章

  1. 内部类、抽象类、接口基本知识详解
  2. 如何禁止谷歌浏览器隐藏url的www前缀
  3. ASP.NET 本地化 (localization)
  4. ●BZOJ 1396 识别子串
  5. 解决ios上微信无法捕获返回键按钮事件的问题
  6. opencv 简单、常用的图像处理函数(2)
  7. Linux命令之查找
  8. Qt GUI@学习日志
  9. Javascript实现BFS算法
  10. 六、spring之通过FactoryBean为ioc容器中添加组件