
算法
文章平均质量分 56
<Running Snail>
奇点将至
展开
-
单调栈(附例题)
文章目录何为单调栈例题1例题2何为单调栈顾名思义,单调栈即满足单调性的栈结构。与单调队列相比,其只在一端进行进出。将一个元素插入单调栈时,为了维护栈的单调性,需要在保证将该元素插入到栈顶后整个栈满足单调性的前提下弹出最少的元素。例如,栈中自顶向下的元素为1,3,5,10,30,501,3,5,10,30,501,3,5,10,30,50,插入元素202020时为了保证单调性需要依次弹出元素1,3,5,101,3,5,101,3,5,10,操作后栈变为20,30,5020,30,5020,30,50。原创 2021-07-21 20:12:37 · 321 阅读 · 1 评论 -
超长正整数的加法
【问题描述】编写程序实现两个超长正整数(每个最长80位数字)的加法运算。【输入形式】从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083)。第一行是超长正整数A;第二行是超长正整数B;【输出形式】输出只有一行,是两个长整数的运算结果,从高到低依次输出各位数字。各位数字紧密输出。算法提示:1.用字符串输入两个超长整数,分别存放在两个字符串中,每一位对应一个字符串中的字...原创 2019-11-20 21:59:10 · 9483 阅读 · 0 评论 -
C++11特性
作者:张宇航_Ken 链接:https://www.jianshu.com/p/d0a98e0eb1a8 来源:简书文章目录1. 类型推导 Auto Type2. 遍历 foreach关于auto和auto&数组STL容器map1. 类型推导 Auto Type过去的这种冗长的类型声明std::map<int, std::string>::const_iterator itr = m.find(1);现在可以写成这样了auto itr = m.find(1);..原创 2021-04-09 21:03:35 · 191 阅读 · 0 评论 -
C++ vector 容器
文章目录为什么要使用 vector1.vector可以动态分配内存2.vector重写了比较运算符及赋值运算符3.vector便利的初始化4. 以邻接表的方式**储存图**基本函数实现容器内元素的访问常用函数示例基本用法排序vector翻译为向量,但是这里使用“变长数组”的叫法更容易理解,也即“长度根据需要而自动改变的数组”。为什么要使用 vector1.vector可以动态分配内存在考试题中,有时会碰到只用普通数组会超内存的情况,这种情况使用 vector会让问题的解决便捷许多。vector还支持原创 2021-04-06 12:04:58 · 1098 阅读 · 1 评论 -
数据结构(线性表)——神奇的幻方
题目幻方是一个很神奇的N*N矩阵,它的每行、每列与对角线,加起来的数字和都是相同的。我们可以通过以下方法构建一个幻方。(阶数为奇数)第一个数字写在第一行的中间下一个数字,都写在上一个数字的右上方:a.如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列b.如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行c.如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方输入一个数字N(N<=20)N(N<=20)N(N<=2原创 2021-03-31 11:48:26 · 815 阅读 · 0 评论 -
数据结构(字符串)—— 删除“b“和“ac“
题目请设计一个删除字符串中的“b”和“ac”的算法,要求满足如下的条件:(1)字符串只能遍历一次;(2)不能使用额外空间,即辅助空间为O(1)。思路分析因为不能使用额外空间,所以还是只能在字符串S本身上进行操作,将除了b,cb,cb,c的字符前移,遇到ccc时要看已经前移的最后一位是不是a,如果是的话将aaa覆盖掉,下标i,ji,ji,j分别记录字符串遍历和前移字符的位数,遍历一遍之后前jjj位便是删除后的字符串C++代码#include<iostream>#include &l原创 2021-03-30 08:48:26 · 1418 阅读 · 0 评论 -
数据结构(字符串)—— 两字符串前后缀相等
题目对于两个串A和B ,给出一种算法使得能够保证正确地求出最大的L值,使得A串中长为L的前缀与B串中长为L的后缀相等,并分析该算法的复杂度。思路和复杂度分析对于本题,将串s1与串s2合并得到字符串P,通过求串P的前缀与后缀相同的最大长度,得到题解。求串P的前缀与后缀相同的最大长度进一步转换为在KMP算法中所求的next数组的值但是要注意调整的是:要求next数组长度是比字符串长度P多一位,next最后一位的值就是最大的L值在KMP算法中,求next数组是在一次循环中完成,对于每个位置原创 2021-03-30 08:46:15 · 2776 阅读 · 0 评论 -
数据结构(字符串)—— 循环旋转字符串的判断
题目请设计一个线性时间的算法,判断字符串 S 是否是另一个字符串 S’ 的循环旋转。例如, arc和car是彼此的循环旋转。思路分析S 和 S’ 长度不等时,肯定不是循环旋转将 S 扩大到两倍,相当于变为 S=S+S(例如arc变为arcarc),如果S’ 是新生成的S的子串,那么S’ 是S的循环旋转,否则,不是循环旋转。因为要求线性时间的算法,所以判断是否是字串时,用KMP匹配算法C++代码#include<iostream>#include <algorithm&原创 2021-03-30 08:42:02 · 1485 阅读 · 0 评论 -
数据结构——实现双栈操作
题目将编号为 0 和 1 的两个栈存放于一个数组空间 V[m]中,栈底分别处于数组的两端。当第0 号栈的栈顶指针 top[0]等于-1 时该栈为空;当第 1 号栈的栈顶指针 top[1]等于 m 时,该栈为空。两个栈均从两端向中间增长(见下图)。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。双栈数据结构的定义如下:代码#include <stdio.h>#include <stdlib.h>#include <iostream>using na原创 2021-03-27 16:54:29 · 5070 阅读 · 3 评论 -
C++中1LL避免强制转换
变量a为int型,b为long long型赋值时b = a * 1LLa * 1LL 之后类型就转换为long long,原创 2021-02-01 11:13:57 · 438 阅读 · 1 评论 -
线段树
前言线段树是算法竞赛中常用的用来维护 区间信息 的数据结构。线段树可以在 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。线段树维护的信息,需要满足可加性基本结构如图,从原数组 a 生成线段树d 的一个情况。第 i 号节点存储的是第 $2×i,2×i+1 $号节点的信息和假设 i 号节点范围 [l,r] ,mid=(l+r)/2mid=(l+r)/2mid=(l+r)/2,则:i×2i×2i×2 范围:[l,mid][l,mid][l,mi原创 2021-01-27 23:41:48 · 111 阅读 · 0 评论 -
树状数组(BIT)
OI Wiki《算法笔记》文章目录前言lowbit运算形式一形式二树状数组基本知识怎么知道某个点由哪几个点组成单点修改+单点查询前言利用大节点来存储小节点的信息。在查询或修改的时候直接利用大节点的信息,节省时间。事实上,树状数组的代码要比线段树短得多,思维也更清晰,在解决一些单点修改的问题时,树状数组是不二之选。lowbit运算形式一lowbit(x)=2max{i│xmod 2i=0}lowbit(x) = 2^{max \{{i│x\mod 2^i=0\} }}lowbit..原创 2021-01-27 11:57:00 · 330 阅读 · 0 评论 -
离散化
文章目录简介实现离散化数组对 `vector` 进行离散化简介离散化本质上可以看成是一种 哈希 ,其保证数据在哈希以后仍然保持原来的全/偏序关系。通俗地讲就是当有些数据因为本身很大或者类型不支持,自身无法作为数组的下标来方便地处理,而影响最终结果的只有元素之间的相对大小关系时,我们可以将原来的数据按照从大到小编号来处理问题,即离散化。用来离散化的可以是大整数、浮点数、字符串等等。实现C++ 离散化有现成的 STL 算法:离散化数组将一个数组离散化,并进行查询是比较常用的应用场景:// a[原创 2021-01-27 11:44:47 · 325 阅读 · 0 评论 -
C++ vector用法
vector翻译为向量,但是这里使用“变长数组”的叫法更容易理解,也即“长度根据需要而自动改变的数组”。在考试题中,有时会碰到只用普通数组会超内存的情况,这种情况使用 vector会让问题的解决便捷许多。另外, vector还可以用来以邻接表的方式储存图,这对无法使用邻接矩阵的题目(结点数太多)又害怕使用指针实现邻接表的读者是非常友好的,写法也非常简洁。定义头文件#include<vector>单独定义一个vectorvector<typename>name;原创 2021-01-13 20:11:07 · 297 阅读 · 0 评论 -
根据线性递推的DP公式如何写出变换矩阵
一组DP状态,其实等价于一个向量。而DP状态的转移方程,可以是对一个向量做变形的矩阵。那么本质上从1个向量到另一个状态的向量,是可以通过一个矩阵来做到。矩阵具有结合律,我们可以先对右半部分矩阵用快速幂得到一个终极的变形矩阵,再乘以向量,就可以把O(N)的计算 优化到 O (LOG (N))以大家最熟悉的斐波那契数列为例:递推公式为 dp[i]=dp[i−1]+dp[i−2]dp[i] = dp[i-1] + dp[i - 2]dp[i]=dp[i−1]+dp[i−2],那么每一个新的数的计算依赖于前2个原创 2020-08-30 21:57:46 · 1076 阅读 · 0 评论 -
矩阵快速幂(附模板)
求解矩阵 A 的 N 次方,我们可以类比整数快速幂,写一个矩阵的结构体,用一个matmul函数来定义矩阵的乘法,具体实现过程与整数快速幂类似(整数快速幂)模板struct mat{ ll m[maxn][maxn];}unit;void init(){ for(int i=1;i<maxn;i++) unit.m[i][i]=1;}mat matmul(mat a,mat b)//ans=矩阵a*矩阵b{ mat ans; ll tmp原创 2020-08-30 13:13:48 · 441 阅读 · 1 评论 -
整数快速幂(原理+模板)
原理求xNx^NxN时,根据n的二进制位数,分为xn1+xn2+xn3+xn4……x^{n1}+x^{n2}+x^{n3}+x^{n4}……xn1+xn2+xn3+xn4……例如:在求x18x^{18}x18时,我们可以拆分成 x16x^{16}x16、x2x^2x2的乘积。我们观察18的二进制数(10010),发现二进制第 i 位上的值为 1 ,在乘积中就要有x2ix^{2^i}x2i 的一项。据此我们可以利用遍历二进制数的每一位快速求出 xNx^NxN。模板int qmi(int x, int原创 2020-08-30 12:54:12 · 234 阅读 · 0 评论 -
子集和问题(回溯法)
题目描述给定一个含有n个元素的整形数组a,再给定一个和sum,求出数组中满足给定和的所有元素组合,举个例子,设有数组a[6] = { 1, 2, 3, 4, 5, 6 },sum = 10,则满足和为10的所有组合是{1, 2, 3, 4}{1, 3, 6}{1, 4, 5}{2, 3, 5}{4, 6}注意,这是个n选m的问题,并不是两两组合问题解法一:穷举法最直观的想法就是穷举,把数组中元素的所有组合情况都找出来,然后看看哪些组合满足给定的和即可,这种方法的计算量非常大,是指数级的,假原创 2020-05-26 15:12:20 · 4890 阅读 · 1 评论 -
Floyd-傻子也能看懂的弗洛伊德算法
暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。上图中有4个城市8条公路,公路上的数字表示这条公路的长短。请注意这些公路是单向的。我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径。这个问题这也被称为“多源最短路径”问题。 现在需要一个数据结构来存储图的...原创 2020-03-09 19:51:18 · 840 阅读 · 0 评论 -
记忆化搜索算法
简述** 记忆化搜索实际上是递归来实现的,但是递归的过程中有许多的结果是被反复计算的,这样会大大降低算法的执行效率。而记忆化搜索是在递归的过程中,将已经计算出来的结果保存起来,当之后的计算用到的时候直接取出结果,避免重复运算,因此极大的提高了算法的效率。** 什么是记忆化搜索呢?搜索的低效在于没有能够很好地处理重叠子问题;动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目...原创 2019-12-03 22:02:05 · 943 阅读 · 1 评论