数据结构
YikNjy
难留少年时,总有少年来。
展开
-
二分应用的小坑———折半插入排序
然后我就特判了一下,发现还是错误,于是我就单独的把check函数拉出来检查一下,发现一个大问题,二分的范围是有限的。就比如这题: 1-5,我的check函数是找到小于等于x的最大值。主要是之前的习惯比较好,会特意注意边界问题,一般不会越界,但是这个插入的会在边界值多出,,,,所以没有想到~~所以,,,,,加上a[0]就可以了,,,,,写着写着卡壳了,以下是没有debug的代码。~~大意了,,,,这么个简单的代码和思想。,,,,之前一直以为哨兵是没有用的。然后返回值都是01,,,,,然会我就发现,,,,,原创 2024-03-09 17:05:12 · 328 阅读 · 0 评论 -
队列(考研篇)
队列(队头队尾的设立)原创 2023-03-21 14:03:47 · 57 阅读 · 0 评论 -
结构体排序在映射中的妙用
结构体排序在映射中的妙用在一个带坐标的struct类中,按照其他变量排序,且排完序之后,要按照原来的顺序 进行输出 或者是 其他操作。原来的顺序 看清楚欧解决方法有很多:1.映射一个变量数组多开一个数组记录排序后的顺序变量。2.重新排序,按照原节点的顺序来排序。有的人可能会问:为什么需要再一次排序,第一个方法他不香吗?对没错,第一个对于没有改变原来变量的问题来说确实很香,但是如果改变其中的变量的话或者是变量相等的话,那么就无法做到完美的映射了,所以并不能解决这个问题。让 单身的原创 2021-10-25 21:37:44 · 95 阅读 · 0 评论 -
ST表(RMQ)算法详解
ST的定义:就是一个用来解决rmq(区间最值)问题的算法。相关性质:1.缺点:不支持修改操作。2.时间复杂度: 预处理(O( n*log(n) ) 查询:(O(1));具体操作:1.首先建立f[i][j]首先定义f[i,j]为以第i个数为起点,长度为2^j的一段区间中的最大值2.预处理 根据状态方程预处理整个过程3.查询。状态表达式:要知道,f[i][j]=max(f[i][j-1],f[i+(1<<(j-1)][j-1]);f[i][j-1]表示:闭区间[i ,原创 2021-11-10 16:08:11 · 503 阅读 · 0 评论 -
常见的语法错误(持续更新)
运算符:1."++","–"“++”,"–"两个运算符在代码语言中的使用一般来说用法不会有很大的变动,但是错误的理解在算法题中,可能是致命的,因为可能就是因为这么一个小的错误可能会导致一直wa掉。#include <iostream>#include <cstring>#include <algorithm>using namespace std;int main(){ int a=1,b=1; int x=a++; //先执原创 2021-09-16 21:48:04 · 2574 阅读 · 0 评论 -
表达式求值(中后缀知识恶补)
acwing3302良好的观看体验题意:给你一个表达式,叫你求出这个表达式的值,表达式由数字括号和一元运算符构成。在数据结构的课本中有过相对应的例题,其实就是利用表达式的前中后缀来求表达式的值。那么相应的三个问题就伴随产生:1.前后缀表达式相比中缀表达式的优点是什么呢?2.怎么样才能将中缀表达式转化成后缀表达式呢?2.如果变成了后缀表达式又该怎么计算呢?后缀小知识:20世纪50年代,波兰逻辑学家Jan Łukasiewicz想到了一种不需要括号的后缀表示法,我们称之为逆波兰表示(Reve原创 2021-07-10 17:23:19 · 123 阅读 · 0 评论 -
滑动窗口队列
添加链接描述给定一个大小为 n≤106 的数组。有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到 k 个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为 [1 3 -1 -3 5 3 6 7],k 为 3。窗口位置 最小值 最大值[1 3 -1] -3 5 3 6 7 -1 31 [3 -1 -3] 5 3 6 7 -3 31 3 [-1 -3 5] 3 6 7 -3 51 3 -1 [-3 5 3] 6 7 -3 51 3 -1 -3 [5原创 2021-03-14 16:24:10 · 292 阅读 · 0 评论 -
并查集笔记
并查集: fa[N] //表示的是第i个元素的父亲节点1.首先是进行合并操作:void un(int u,int v){ u=fd(u); v=fd(v); if(u==v)return -1;//表在同一集合中 if(u>v)fa[u]=v; else fa[v]=u;//将长的一个集合连到短的上去会时间少点 return 0;}2.递归寻找要查找其根节点:int fd(int x){ if(fa[x]==x)原创 2021-03-23 17:56:41 · 56 阅读 · 0 评论 -
栈的操作例题
#include <iostream>#include <cstdio>#include <cstring>#include <stack>using namespace std;const int maxn=1e4;stack<char> s;char a[maxn],b[maxn];char ch[maxn][4];int main(){ int n; while(cin>>n) ..原创 2021-03-19 15:41:39 · 184 阅读 · 0 评论 -
堆的笔记(模板)
首先是堆的定义:堆就是完全二叉树,从头到尾,头最小下面是关于堆的代码实现:首先是在数组中实现堆:for(int i=n/2;i;i--)down(i);// O(n) 建堆//downdown的意思是在一个头如果小于他的两个儿子那么进行交换,所以是下降的意思,那么代码的意思是从二分之一的数开始进行对每个点的down操作,那么就遍历到每个数了。每三个点成一个down的三点。所以只需要从n/2开始到 i=0 时即可,全部形成了头比两个儿子小的堆了。down的代码:void down(i原创 2021-04-27 17:56:34 · 63 阅读 · 0 评论 -
用数组实现静态链表
萌新学习静态链表的笔记:静态链表和动态链表是线性表链式存储结构的两种不同的表示方式。1、静态链表是用类似于数组方法实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配地址空间大小。所以静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针。2、动态链表是用内存申请函数(malloc/new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。而在算法题中经常使用静态链表而不是动态,因为动态原创 2021-03-12 16:37:15 · 1091 阅读 · 0 评论