IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 百亿富翁(单调栈) -> 正文阅读

[C++知识库]百亿富翁(单调栈)

题目描述

已知这排楼房一共有 N N N 栋,编号分别为 1 ~ N 1\sim N 1N,第 i i i 栋的高度为 h i h_i hi?

好奇的小明想知道对于每栋楼,左边第一个比它高的楼房是哪个,右边第一个比它高的楼房是哪个(若不存在则输出 ? 1 -1 ?1)。
百亿富翁(单调栈)

C++(单调栈)

首先想到暴力解法,直接写两个for循环。

但这道题数据量为 1 0 5 10^5 105,所以要想一个时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)的解法。

拿左边第一个比它高的楼盘来说,我们可以维护一个单调栈来处理这一过程。当扫到一个数时,如果此时栈顶的元素比当前元素还小的话,那必然不可能是后续数据的答案,因为这里要找的是左边第一个比它高的楼盘,就可以令栈顶元素出栈。

#include <iostream>
#include <cstdio>
#define x first
#define y second
using namespace std;
const int N = 7e5 + 10;
typedef pair<int, int> PII;
PII stk[N], a[N];
int tt;
int rightans[N];

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		int x;
		scanf("%d", &x);
		a[i] = {x, i};
	}
	// 左边第一个比它高
	for (int i = 1; i <= n; i++) {
		while (tt && stk[tt].x <= a[i].x) tt--;
		if (tt) cout << stk[tt].y << ' ';
		else cout << -1 << ' ';
		stk[++tt] = a[i];
	} 
	cout << endl;
	tt = 0;
	// 右边第一个比它高
	for (int i = n; i > 0; i--) {
		while (tt && stk[tt].x <= a[i].x) tt--;
		if (tt) rightans[i] = stk[tt].y;
		else rightans[i] = -1;
		stk[++tt] = a[i];
	} 
	for (int i = 1; i <= n; i++) cout << rightans[i] << ' ';
	
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 22:27:40  更:2022-04-07 22:28:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:59:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码