
向右看齐Look Up
初始化栈:栈将用来保存奶牛身高和索引,以便后续查找。 从右到左遍历:我们从最后一只奶牛开始遍历到第一只,这样可以确保我们处理的是右边的奶牛。 使用栈来记录可能的仰望对象:栈中的元素是按身高递减排列的。当处理当前奶牛时,如果栈顶的元素比当前奶牛高,则当前奶牛的仰望对象就是栈顶的奶牛。 弹出栈顶元素:如果栈顶的元素不比当前奶牛高,则弹出栈顶元素,继续检查下一个元素,直到找到一个比当前奶牛高的或者栈空。 记录结果:如果栈不为空,则记录栈顶的奶牛索引作为当前奶牛的仰望对象,否则记录0。 读取输入:首先读取奶牛的数量 初始化栈和结果数组:栈用于保存身高和索引,结果数组 从右到左遍历:遍历每只奶牛,从最后一只开始。 处理当前奶牛:对于当前奶牛,检查栈顶的元素是否比它高。如果是,记录仰望对象并将当前奶牛入栈。否则,弹出栈顶元素,继续检查。 输出结果:遍历结果数组,输出每只奶牛的仰望对象。
发布日期:2021-05-07 07:06:15
浏览次数:15
分类:精选文章
本文共 1324 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要找到每只奶牛离她最近的仰望对象。每只奶牛都在向右看齐,所以我们需要判断右边的奶牛是否比她高。如果是,那么右边的奶牛就是她的仰望对象。
方法思路
为了高效地解决这个问题,我们可以使用单调栈的方法。单调栈可以帮助我们在处理每只奶牛时,快速找到右边比她高的奶牛。
具体步骤如下:
解决代码
#include#include using namespace std;int main() { int n; scanf("%d", &n); vector > stack; vector ans(n + 1); // 1-based indexing for (int i = n; i >= 1; --i) { int h; scanf("%d", &h); // Pop all elements from stack that are <= current h while (!stack.empty() && stack.top().first <= h) { stack.pop(); } if (!stack.empty()) { ans[i] = stack.top().second; } else { ans[i] = 0; } stack.push({h, i}); } for (int i = 1; i <= n; ++i) { printf("%d\n", ans[i]); } return 0;}
代码解释
n
,然后读取每只奶牛的身高。ans
用于存储每只奶牛的仰望对象。这种方法确保了在处理每只奶牛时,栈的操作都是线性的,从而整体复杂度为 O(N)。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月09日 13时09分22秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
H5 贪吃蛇源码
2019-03-06
c# 判断3个数是否连续最优式子
2019-03-06
从零开始学安全(十六)● Linux vim命令
2019-03-06
从零开始学安全(三十四)●百度杯 ctf比赛 九月场 sqli
2019-03-06
3389连接痕迹清除
2019-03-06
发生系统错误 6118
2019-03-06
c# API接受图片文件以文件格式上传图片
2019-03-06
阿里巴巴Json工具-Fastjson教程
2019-03-06
Spring Cloud Gateway - 快速开始
2019-03-06
Spring Security 实战干货:理解AuthenticationManager
2019-03-06
Java对象转JSON时如何动态的增删改查属性
2019-03-06
Python 面向对象进阶
2019-03-06
Linux常用统计命令之wc
2019-03-06
Git安装及使用以及连接GitHub方法详解
2019-03-06
docker容器与虚拟机的区别
2019-03-06
shell脚本里使用echo输出颜色
2019-03-06
Python2跟Python3的区别
2019-03-06
并发编程——IO模型详解
2019-03-06
Java之封装,继承,多态
2019-03-06