- 博客(41)
- 收藏
- 关注
原创 「数学::质数」试除法 / Luogu P5736(C++)
质数是指在大于1的自然数中只能被1和它自己整除的数。我们可以利用这一除法性质对质数进行判定。
2024-09-07 18:38:29 437
原创 「图::存储」邻接矩阵|边集数组|邻接表(C++)
图是一种高级数据结构:链表是一个节点由一条边指向下一个节点,二叉树是一个节点由两条边指向下两个节点,而图是由任意多个节点由任意多条边指向任意多个节点。对于这种复杂的结构,如何存储在计算机的程序语言中呢?
2024-09-05 00:38:13 814
原创 「数组」计数排序|桶排序|基数排序(C++)
这三种排序都是非比较类排序,它们只关注元素的绝对特征,而忽视相对特征,同时,也被称为时间换空间类型算法,虽然适用范围较为狭窄,但是在适用范围内时间效率较高。
2024-09-03 23:14:22 1494
原创 「数组」二分查找模版|二段性分析|恢复二段性 / LeetCode 35|33|81(C++)
二分查找的本质就是利用数组的二段性进行快速的分析。
2024-08-30 22:31:47 1413
原创 「数组」逆序对 / LeetCode LCR 170(C++)
我们希望求解一个数组的全部逆序对,暴力做法似乎很直观,但是时间复杂度是O(n²)级别的。但是归并排序提供给我们一种手段,在nlogn时间内解决这个问题。
2024-08-24 22:04:56 569
原创 「数组」数组双指针算法合集:二路合并|逆向合并|快慢去重|对撞指针 / LeetCode 88|26|11(C++)
双指针是一种简单而又灵活的技巧和思想,单独使用可以轻松解决一些特定问题,和其他算法结合也能发挥多样的用处。
2024-08-22 20:59:24 1032
原创 「数组」希尔排序 / 区间增量优化(C++)
希尔排序则是充分利用了插入排序两个特点的插入排序promax进化版。本文讲解了这种算法以及对应的优化方案。
2024-08-21 22:58:14 1064
原创 「字符串」字符串哈希|RK匹配:前缀哈希|滚动哈希 / LeetCode 28(C++)
我们今天从最简单的暴力匹配算法BF讲起,谈谈字符串哈希思想,以及两种哈希:前缀哈希和滚动哈希
2024-08-18 23:27:07 1148
原创 「字符串」详解AC自动机并实现对应的功能 / 手撕数据结构(C++)
AC自动机是能以线性时间复杂度对整个文本进行黑名单词汇统计的数据结构。本文详解并实现了这种结构。
2024-08-17 23:56:25 730
原创 「数组」快速排序 / 随机值优化|小区间插入优化(C++)
快速排序是一种常见的高级排序算法。我们通过讲解其中的选择与分区操作来理解分治思想,并通过提出优化方案来实现很稳定的快速排序
2024-08-10 18:16:10 1081
原创 「栈」实现LIFO栈(先进后出栈|堆栈|stack)的功能 / 手撕数据结构(C++)
栈,是一种基本的数据结构,也是一种数据适配器。它在底层上以链表方法或动态数组方法实现。本文选择了使用动态数组来实现这种数据结构。
2024-08-09 20:16:54 1002
原创 「链表」链表原地算法合集:原地翻转|原地删除|原地取中|原地查重 / LeetCode 206|237|2095|287(C++)
对于一张单向链表,我们总是使用双指针实现一些算法逻辑,这旨在用常量级别空间复杂度和线性时间复杂度来解决一些问题。
2024-08-07 23:15:34 1275
原创 「链表」Floyd判环法(弗洛伊德判圈法|龟兔赛跑法)|公式推导环入口 / LeetCode 142(C++)
Floyd判环算法,也称龟兔赛跑算法,可用于判断链表、迭代函数、有限状态机是否有环并找出环的位置。本文详解了这种算法。
2024-08-07 14:33:24 794
原创 力扣第45题:跳跃游戏 贪心DP(C++)
DP数组的实现就不必多说了,无非是dp[i]=dp[j]+1(到i的最少步数是j的步数+1,其中j是前面的所有能跳到i的位置里步数最少的)只是还不知道j是多少而已。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。注意,在j处能跳到的最远位置是下标j+nums[j]的位置。如果j不能跳到i,那么i就大于这个最远位置。思考一个问题:如果在位置j不能跳到位置i(j
2024-08-06 20:48:17 546
原创 「队列」实现FIFO队列(先进先出队列|queue)的功能 / 手撕数据结构(C++)
队列,是一种基本的数据结构,也是一种数据适配器。本文实现了这种数据结构。
2024-08-05 21:09:12 1530
原创 力扣第120题:三角形最短路径和 二维DP逐行求解(C++)
对于第i行第j列的最优解,有dp[i][j]=min(dp[i-1][j],dp[i-1][j-1])+triangle[i][j]。表示dp数组最初有一行一列(vector(1)无名vector表示第一行有1个值),赋值为triangle[0][0]。需要注意列遍历在最左侧或最右侧时dp[i][j]直接等上一层的对应位置+triangle[i][j]。自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。用二维数组dp表示三角形每个位置的最优解。三角形的每一行都由上一行的最优解决定。
2024-08-04 22:08:10 177
原创 「字符串」详解Trie(字典树|前缀树)并实现对应的功能 / 手撕数据结构(C++)
字典树是一种高效记录字符串和查找字符串的数据结构。本文实现了这种数据结构。
2024-08-03 17:38:32 1244
原创 力扣第121题:买卖股票的最佳时机 维护最低值(C++)
反之如果prices[i]大于low则判断prices[i]-low是否比ans更大,更新ans。在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。同时,你不能在买入前卖出股票。定义low=prices[0],ans=0,for循环从i=1开始,适时更新low和ans。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回。设计一个算法来计算你所能获取的最大利润。记录当前遍历得到的最低值low和已知最大利润ans,
2024-07-30 15:44:36 132
原创 「数组」C++STL库vector(动态数组|向量)全部函数介绍
vector 是一种C++标准模板库STL中定义的一种序列容器,它允许你在运行时动态地插入和删除元素。本文介绍了vector的全部成员函数。
2024-07-29 23:54:35 1201
原创 「数组」冒泡排序|选择排序|插入排序 / 及优化方案(C++)
冒泡排序、选择排序、插入排序是最基础的三种排序算法。我们将讲解这三种排序以及其对应的优化方案来理解一些基础的排序思想。
2024-07-19 02:50:42 1176
原创 力扣第107题:二叉树的层序遍历 II 队列广搜与栈缓存(C++)
每次外层循环循环定义int len=队列的当前长度,通过内层循环while(len--)来保证队列内的值全部更新一次,内层循环中依次取出队头后加入到layer数组中,判断其左子树和右子树是否需要入队(空节点不入队)。que.empty())外层循环,我们的每一次外层循环都完成一层搜索,定义layer数组来储存每一层的搜索结果。每完成一次外层循环,队列中的每个元素都向他的左右子树演替了一次,队列清空后即搜索结束。我们将每一层的搜索结果入栈,生成答案时依次出栈就得到了倒序的层序遍历结果。最后清空栈返回答案。
2024-07-17 18:39:01 362
原创 力扣第38题:外观数列 奇技淫巧模拟(C++)
定义第一代string ans="1",然后从第二代开始模拟,循环过程中进行cnt计数,如果下一个字符不再和当前字符相等,就把cnt和ans[i]追加到下一代temp中.(RLE)是一种字符串压缩方法,其工作原理是通过将连续相同字符(重复两次或更多次)替换为字符重复次数(运行长度)和字符的串联。countAndSay(3) = "11" 的行程长度编码 = "21"countAndSay(2) = "1" 的行程长度编码 = "11"为了防止i+1溢出,定义string s=ans+'x',x是占位符。
2024-07-14 22:31:48 776
原创 力扣第46题:全排列 库函数next_permutation与sort介绍()
next_permutation可以将区间内的值向降序排列演替一步,一直到区间变为降序排列位置。在这个过程中会生成整个区间的全排列,如果区间已经是降序排列,那么返回false值,否则返回true值。定义ans保存答案,先利用sort进行升序排序,(否则next_permutation只产生当前状态之后的排列而不是全排列),初始状态压入ans之后循环生成答案即可。(最后一次循环会生成降序排列(此时返回true),之后再次进入循环才返回false所以不会丢答案)sort函数可以将区间内进行升序排列;
2024-07-10 22:24:58 209
原创 力扣第70题:爬楼梯 动态规划DP入门(C++)
我们开始遍历,从i=3开始,我们对ans[i]施加状态转移方程ans[i]=ans[i-1]+ans[i-2],什么意思呢?走到第i个台阶的方法是走到第i-1个台阶的方法和第i-2个台阶的方法之和。我们分割原始问题为多个子问题,在遍历数据的过程中,如果能根据之前得到的信息动态解决当前的子问题,那么就可以在线性时间内解决很多需要多次遍历的问题。对于本题目,他的dp表中ans[0]=0,ans[1]=1,ans[2]=2,此为初始状态。本题中定义ans[i]为dp表,表示走到第i个台阶的方法数。
2024-07-09 14:22:44 289
原创 「字符串」Manacher算法(马拉车)/ LeetCode 05(C++)
Manacher算法利用回文串的对称性质实现线性时间内的回文串查找。本文详解了这种算法的思想和实现代码。
2024-07-09 13:16:01 1804
原创 力扣第19题:删除链表的倒数第N个结点 记忆化存取(C++)
遍历结束后,访问address中下标为address.size()-n-1的位置,他是第n个结点的上一个节点(注意address的长度比原链表长度大1个节点,address[0]是我们申请的新头结点),将address.size()-n位置的的next指针与之连接,即抛弃了address.size()-n这个节点。构造vectoraddress(1,ans),它当前长度为1,存入了我们新申请的头结点。申请一个新的头结点,与原始链表相连,防止空链表数据的输出异常。
2024-07-08 16:04:56 407
原创 力扣第7题:整数反转 字符串函数综合运用(C++)
strcmp(char *str1,char *str2)按字典序逐个比较str1和str2,到某个字符时str1大于str2则返回正数,完全一致则返回零,否则返回负数(与长度无关,只取决于对应位置的字符大小关系,如"ab"大于"aaa")reverse(a或begin(),a+n或end())将容器a到a+n(或begin到end的左闭右开区间的内容翻转)stoi(char *str)将由str[0]开始的完全由数字和正负号组成的子串转换为其书面意义上的数字。中的数字部分反转后的结果。
2024-07-06 22:59:12 346
原创 力扣第22题:括号生成 深度优先搜索(DFS)和它的优化(C++)
对于这道题目,DFS一开始接收到空字符串,然后进入函数体后判断剪枝情况(我们可以利用已知信息来判断继续向下探还能否得到结果的可能性),然后分别递入下一级DFS(两个分支分别加上左括号'('和右括号')')。想象一个矿井,从地面到井底有多层平台,每层平台都能从此处向下连接到一个不同的矿底,我们先一路探到底,发现最底部无矿后再向上爬一个平台,然后走向这个平台连接的矿底。我们定义l和r记录左右括号的当前数量,如果 右括号多于左括号||右括号多于n个||左括号多于n个 都不可能得到一个拥有全部由小括号的字符串了。
2024-07-06 21:52:02 376 1
原创 力扣第6题:Z字形变换 交替V和Λ规律法(C++)
我们利用两层循环逐层求解即可,外层循环表示当前层,内层循环交替变换A和Λ(注意i==0始终为V和inumRows-1始终为Λ,两种情况不变换)我们画V字时,坐标移动长度=(2numRows-1)-2(i+1)+1 (最大V字的长度-缩短的长度+(当前在i位置不算)),以从上往下、从左到右进行 Z 字形排列。同样的,可以发现画Λ时坐标移动2i的长度。在线性时间内用找规律快速求解。关流后实测击败全世界。
2024-07-02 23:20:02 444
原创 力扣第4题:寻找两个正序数组的中位数 库函数nth_element介绍(C++)
nums1.insert(num1.end(),num2.begin(),num2.end()),将整个向量组2追加到向量1的后面,利用nth_element排中位数,判断向量长度的奇偶,选择直接输出中位数还是求平均值。它的作用是:将区间中第n小的元素排在第n个位置上(升序排列)(注意不是整个区间排序,这个函数只保证第n个元素的正确)例如 有数组a,则nth_element(a,a+2,a+4)会将前四个数中第3小的数排在第3位(合并数组 = [1,2,3] ,中位数 2。实测击败90.5%。
2024-06-30 23:00:51 247
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人