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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 1057 Stack -> 正文阅读

[数据结构与算法]1057 Stack

目录

解题思路

AC代码

解题思路

虽然题目的名字是栈,但是这题和栈的关系很小,甚至我都没有用到stack这个数据结构,而是用vector<int>的pop_back()来模拟栈的弹出。

主要考察的是:在线查询,也就是查询过程中库中的元素可能因为插入删除或修改而发生改变。具体来说就是:查询序列中第K大的元素是什么

这里用到了分块思想降低查找的复杂度,块的大小是总元素个数开平方的向下取整,这个需要记住。

具体的思想是:先确定第K个元素在哪个块,再从块的第一个元素起遍历来找到这个元素。

两个重要的数据结构如下

int mycount[maxn+1] = {0};//count[x]表示x的数量
int block[BLOCK_NUM+1] = {0};//block[x]表示第x+1块有多少数据 

易错点

加入元素的时候,上述3个数据结构都要增加,不容易忘记

mystack.push_back(x);
mycount[x]++;
block[x/BLOCK_SIZE] ++; 

弹出元素的时候,往往就把后两个忘记了

mycount[mystack[mystack.size()-1]]--;//非常容易漏掉
block[(mystack[mystack.size()-1])/BLOCK_SIZE]--; 
mystack.pop_back();

AC代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<utility>
#include<bits/stdc++.h>
using namespace std;

const int INF = 1e9;//10的9次方 
const double eps = 1e-3;

const int maxn = 100000;
const int BLOCK_SIZE = 316;
const int BLOCK_NUM = maxn/316;

vector<int> mystack;  

int mycount[maxn+1] = {0};//count[x]表示x的数量
int block[BLOCK_NUM+1] = {0};//block[x]表示第x+1块有多少数据 

//12 sqrt(12) = 4
//BLOCK_SIZE = 4
//BLOCK_NUM = 3

int main(){
		
	int n;//操作的数量
	char s[10];//读入的操作名称
	int x;//读入的元素 
	
	scanf("%d",&n);
	while(n--){
		scanf("%s",s);
		if(!strcmp(s,"PeekMedian")){
			if(mystack.size()==0){
				printf("Invalid\n");
				continue;
			}else{
				int size = mystack.size();//得到当前栈中数字的数量 
				int idx;//第idx大的数是我们想要的
				if(size%2==0)idx = size/2;
				else idx = (size+1)/2;
				int sum = 0;
				int out = false;//用于跳出 
				for(int i=0;i<=BLOCK_NUM;i++){
					if(out)break;
					sum += block[i];
					if(sum>=idx){
						int no = sum - block[i];
						for(int j=i*BLOCK_SIZE;j<(i+1)*BLOCK_SIZE;j++){
							if(out)break;
							if(mycount[j]>0){
								int temp = mycount[j];
								while(temp--){
									no ++;
									if(no == idx){
										printf("%d\n",j);
										out = true;
										break;
									}
								}
							}
						}
					}
				} 
			}
		}
		
		if(!strcmp(s,"Pop")){
			if(mystack.size()==0){
				printf("Invalid\n");
				continue;
			}else{
				printf("%d\n",mystack[mystack.size()-1]);
				mycount[mystack[mystack.size()-1]]--;//非常容易漏掉
				block[(mystack[mystack.size()-1])/BLOCK_SIZE]--; 
				mystack.pop_back();
				continue;
			}
		}
		
		if(!strcmp(s,"Push")){
			scanf("%d",&x);
			mystack.push_back(x);
			mycount[x]++;
			block[x/BLOCK_SIZE] ++; 
		}
	} 
	
	
	return 0; 
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:43:11  更:2021-08-21 15:45:28 
 
开发: 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/25 23:23:55-

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