算法
文章平均质量分 60
算法刷题
饼干烧饼
Orz
展开
-
中缀表达式求值
但这通过已经构建好的二叉树再来进行计算的,要计算其他表达式时,再人为构建一颗树是非常麻烦的,所以可以通过表达式从左向右扫描,通过优先级来构建一颗数,这个过程是通过栈来实现的。1.扫描过程中,当前运算符优先级小于等于前一个运算符(栈顶的运算符)优先级时,代表当前运算符的的子树已经遍历完了,子树内的数字和符号合并计算成一个数值并加入栈内。2.当前运算符的优先级大于前一个运算符(栈顶的运算符)优先级时,代表子树还没有遍历完,直接将当前运算符入栈,等待后序操作。4.遇到’)‘时求出()内的值,并入栈。原创 2024-04-20 16:01:10 · 267 阅读 · 1 评论 -
数学知识--(欧拉函数,快速幂,扩展欧几里得算法)
本文用于记录个人学习,仅供参考。原创 2024-04-06 11:38:41 · 351 阅读 · 0 评论 -
数学知识--(质数,约数)
本文用于个人学习,仅供参考。原创 2024-04-04 22:55:59 · 1177 阅读 · 0 评论 -
哈希表(Hash Table) -- 用数组模拟--字符串前缀哈希
哈希表(Hash Table)是一种数据结构,用于存储键值对。它通过将键映射到表中的一个位置来实现快速的查找操作。在哈希表中,每个键都会经过一个哈希函数的计算,得到对应的哈希值,然后将键值对存储在哈希值对应的位置上。哈希表的主要特点包括:1. 快速的查找操作:通过哈希函数计算出键对应的位置,可以在常数时间内找到对应的值。2. 空间效率高:可以根据实际情况动态调整哈希表的大小,使得空间利用率高。原创 2024-04-01 22:05:13 · 903 阅读 · 0 评论 -
数组模拟堆
堆是一种特殊的树形数据结构,常用于实现优先队列。堆分为最大堆和最小堆两种类型,最大堆要求父节点的值大于等于子节点的值,最小堆要求父节点的值小于等于子节点的值。在堆中,通常使用数组来实现,具体实现时需要满足以下性质:1. 父节点 i 的左子节点在位置2* parent+1,右子节点在位置2* parent+2;子节点 child 的父节点parent位置 parent = (child - 1) / 2(下标从0开始)原创 2024-04-01 14:40:52 · 1147 阅读 · 0 评论 -
并查集
并查集(Disjoint Set)是一种数据结构,用于处理一系列不相交的集合的合并与查询问题。1. 合并(Union):将两个集合合并为一个集合。2. 查询(Find):确定一个元素属于哪个集合,通常用于判断两个元素是否属于同一个集合。并查集通常使用树结构来表示集合,其中每个节点表示一个元素,树的根节点表示集合的代表元素。通过路径压缩和按秩合并(没什么用)等优化方式,可以在近似常数时间内进行合并和查询操作。原创 2024-04-01 00:03:34 · 789 阅读 · 0 评论 -
Trie字典树
Trie(字典树)是一种树形数据结构,用于存储关联数组,其中键通常是字符串。Trie具有以下特点:1. 每个节点包含若干子节点(子节点数量取决于字符集的大小)。2. 从根节点到每个节点的路径上的字符连接起来形成该节点对应的字符串。3. 通常在叶子节点处存储与该字符串关联的值。在Trie中,查找、插入和删除操作的时间复杂度与字符串的长度有关,而与Trie中存储的数据量无关,因此Trie通常用于快速查找、前缀匹配等场景。Trie的基本操作包括插入、查找、删除等。原创 2024-03-31 22:58:31 · 328 阅读 · 1 评论 -
KMP字符串匹配算法
本文用于记录个人算法竞赛学习,仅供参考先来看一个问题对于这个问题,一般暴力做法是:遍历主串,以主串的每个元素为开头分别与模式串对比,遇到不匹配,主串走下一位,模式串重新开始 一 一对比,假设主串长度为n,模式串长度为m,那么时间复杂度是O(n * m)。使用KMP解决这个问题时间复杂度只需要O(n + m)。原创 2024-03-31 21:54:39 · 540 阅读 · 0 评论 -
用数组模拟单链表、双链表、栈、单调栈、队列、循环队列、单调队列
本文用于记录个人学习,仅供参考为什么要用数组模拟而不用现成的STL,因为用数组模拟效率会快一点,比如用结构体+指针的方式创建链表,new的效率会很慢,极端情况可能会超时,所以有时候需要用数组模拟。原创 2024-03-31 18:16:25 · 1179 阅读 · 0 评论 -
区间和并
1.对每个区间的左端点进行排序(升序)(也可以对每个区间的右端点进行排序,只不过操作不同而已)思路:用贪心的思想,一把箭尽可能射中多个气球,借用区间和并,计算弓箭的数量。区间合并指存在区间重叠(或者接壤),将这样若干个区间合并成一个区间。2.判断是否可以合并。原创 2024-03-31 16:17:42 · 160 阅读 · 0 评论 -
离散化
百度百科:离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:原数据:1,999,100000,15;处理后:1,3,4,2;原数据:{100,200},{20,50000},{1,400};处理后:{3,4},{2,6},{1,5};离散化是程序设计中一个常用的技巧,它可以有效的降低时间复杂度。其基本思想就是在众多可能的情况中,只考虑需要用的值。原创 2024-03-31 15:45:44 · 422 阅读 · 0 评论 -
位运算
原理: -x == ~x + 1(取反加一),有x & (~x + 1), ~x会使原来的1变为0,0变为1,再+1会使~x最后一位0变(也就是x的最后一位1)为1,再将(~x + 1)&x就可以得到最后一位1。原创 2024-03-31 12:13:27 · 317 阅读 · 0 评论 -
前缀和与差分
本文用于记录个人学习,仅供参考。原创 2024-03-31 10:50:29 · 1235 阅读 · 0 评论 -
高精度(大整数)
当一个数的位数已经很大了(比如有10^6),常规的数据类型已经存不下了,那么这个时候就可以用数组来存,数组的每个元素代表数的每一位,且保持相对顺序。一般存储方式如图:数组下标从小到大存数的低位到高位,便于后序操作。原创 2024-03-31 00:10:14 · 306 阅读 · 0 评论 -
二分(二段性)
本文用于记录个人算法竞赛学习,仅供参考。原创 2024-03-30 22:08:14 · 573 阅读 · 0 评论 -
分治实现快速排序和归并排序
思想:确定分界点x,将小于分界点的值放在分界点的左边,将大于分界定的值放在分界点的右边,再递归处理两边的左右区间。步骤:1.确定分界点:分界定的确定是随机的,一般取中间点(mid)和左右(L,R)边界点2.调整区间:将小于分界点的值放在分界点的左边,将大于分界定的值放在分界点的右边(降序相反)3.递归:递归处理左右两边,重复上述操作调整区间的实现方式:1.可以开辟两个空间来存放分界点的值,然后再拷贝回去,但这样会额外消耗空间。原创 2024-03-30 20:25:52 · 858 阅读 · 0 评论 -
leetcode--接雨水(双指针法,动态规划,单调栈)
黑色的是柱子,蓝色的是雨水,我们先来观察一下雨水的分布情况:雨水落在凹槽之间,在一个凹槽的左右都会有两个柱子,两个柱子高度可能相同也可能不同,柱子的高低决定了凹槽的雨水的高度,雨水的高度等于两个柱子较低的高度。原创 2024-03-01 22:06:35 · 1190 阅读 · 3 评论 -
三数之和(哈希,双指针)
当a = -2,b = 1(第三个)时,由于-2,1,1组合已经有了,所以就不再需要b = 1的情况了,所以此时开始去重。nums[i] == nums[i - 1]),避免忽略了0,0,0的情况,外层循环i作为a,相当于a = nums[i], b = nums[left], c = nums[right].如果去重条件是(nums[i] == nums[i + 1]),会出现忽略0,0,0的情况;b这里的去重有些复杂,并不是与a的去重一样(前后相等就去重),举个例子-2,1,1,1。原创 2024-02-27 00:36:34 · 433 阅读 · 0 评论 -
有关链表的题目
要注意循环条件的前后顺序,&&会进行短路求值,如果写成(fast->next && fast),当链表节点为偶数个时,此时fast == NULL,很明显NULL->next是错误的。思路:创建一个新链表,给定两个指针遍历两条原链表,小的插入。当有剩余的链表时,直接将剩余的全部一起尾插到新链表中,无需一个一个尾插,因为原链表是有序的。思路:创建一个新链表,newhead指向新链表的头节点,newtail指向当前链表的尾节点;注意:会有一个原链表为空的情况,直接返回另一个原链表。原创 2024-01-26 16:54:12 · 375 阅读 · 0 评论 -
排列算法(递归实现)(1~n全排列)(字典序全排列)
我们要将它们排序,首先分为三种情况:三个数字分别作为第一个位置,那么就要将其放在第一个位置,然后再对后面剩下的数进行排列...很明显这样会重复上述操作,就可以用递归去实现。要跟上面一样,每个数字都要有机会排在第一个位置,同时实现字典序,就要通过三个数字对第一位置循环后移滚动实现,确保字典序最小。位置的替换可以使用swap函数实现,记得位置替换后要再一次换回来,确保每个数字都可以出现在第一个位置,避免了重复的结果。但可以发现上面只能进行全排列,并不能满足字典序全排列,这是为什么?不符合字典序,要怎么实现呢?原创 2024-01-23 22:27:35 · 458 阅读 · 0 评论 -
枚举算法(穷举法)(暴力法)
枚举是指在一定范围内将所有情况一一列举,再通过条件判断得到自己想要的答案;原创 2024-01-22 22:55:50 · 376 阅读 · 0 评论 -
合并两个有序数组(三指针法)
要从nums1后面开始合并,从前面开始合并可能会覆盖掉数据,将l1和l2当前下标的值进行比较,大的排到l指向的位置,并且相应下标和l两个都要减一,直到nums2的元素全部合并到nums1为止。2.l1先小于0,则nums2的元素还没有合并完,且剩下的nums2元素均小于后面需要排入nums1位置的值,所以直接将nums2有序排入即可。l1是nums1的有效数据的最后一位的下标,即m - 1;l2是num2的有效数据的最后一位的下标,即n - 1;1.l2先小于0,则已经将nums2的元素合并完了;原创 2024-01-21 16:13:14 · 347 阅读 · 0 评论 -
移动元素(快慢指针法)
这样做的目的是,str遇到val值时,会直接跳过,dst将在原地待命,直到str后面遇到非val值时,再用dst将其覆盖,最终str遍历完毕,dst即为非val值的个数,由于dst <= numsSize,所以返回dst后可以根据dst创建循环的判断条件,打印出把val值覆盖之后的数组。直到str不再小于numsSize,即str等于numsSize,超出了nums的下标范围,结束str的遍历;str是快指针,dst是慢指针,str遍历数组,dst用于改变数组的值和返回非val的个数;原创 2024-01-21 15:28:29 · 386 阅读 · 0 评论 -
盒子 Box
1.输入每个面的长宽并将每个面较长的一边放在前面。2.判断是否存在三对面分别相等。3.判断是否存在三组四棱相等。原创 2023-12-24 23:41:42 · 753 阅读 · 3 评论 -
纵横字谜的答案 Crossword Answers
每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。这些单词必须从一个起始格(左边是黑格,或是第一列)开始,向右延伸到一个黑格的左边或者整个网格的最右列。然后找出所有竖向单词(),规则同上,这些单词必须从一个起始格(上边是黑格,或是第一行)开始,向下延伸到一个黑格的上边或者整个网格的最下行。有一个 r 行 c 列 (1原创 2023-12-18 22:54:05 · 558 阅读 · 0 评论 -
输出字符串所有周期
如果一个字符串可以由某个长度为k的字符串重复多次得到,则称该串以k为周期。例如,abcabcabcabc周期为:3,6,12.原创 2023-12-18 15:25:34 · 476 阅读 · 0 评论 -
计算由CHON构成的分子的分子量
给出一种物质的分子式(不带括号),求分子量。本题的分子式只包含4种原子,分别为C,H,O,N,原子量分别为12.01,1.008,16.00,14.01(单位:g/mol)。例如,C6H5OH的分子量为94.108g/mol。原创 2023-12-17 22:16:00 · 669 阅读 · 3 评论 -
DNA序列 DNA Consensus String
2.序列的每一列找出出现次数最多的字母,并打印出来(即为最优解);(特殊情况:遇到最大数字相同的字母,打印字典序小的字母,这里代码的处理方式是:由于遍历是由下标从大到小遍历,所以对应字典序也是从小到大的,又由于判断条件是max < arr[k],所以sign小标不会更新,打印的仍然是字典序小的字母)思路:1.遍历每一列字符序列,并将出现的次数存在数组中;3.最小距离为每一列与最优解不同的字母的总和。原创 2023-12-19 16:20:27 · 395 阅读 · 1 评论 -
求最小差值的数字
【代码】求最小差值的数字。原创 2023-12-17 15:16:41 · 399 阅读 · 3 评论 -
循环小数 Repeating Decimals
【代码】循环小数 Repeating Decimals。原创 2023-12-24 18:11:44 · 601 阅读 · 3 评论 -
蛇形填数的实现
总结来说,数字一从左上角为起始位置,逆时针填充,每次填充都是前一次填充的数+1,直到填充完毕,也就是填充到n*n个数填满,也等同与最后一个数为n*n。当填到12的下一步后,我们发现1已经填充过了,所以向下拐弯,也就是当遇到已经填充过的要拐弯。我们清楚填充过程是从外圈向内圈填充的,也清楚填充时的方向也是不同的,比如4*4填充顺序是下,左,上,右,下,左,上,一共4个方向,而每个方向至少填充一个数,所以我们需要4个表示不同方向的循环语句;题目:在n*n方阵中填入1,2,3,4……n*n,要求填成蛇形。原创 2023-12-08 17:31:51 · 534 阅读 · 0 评论 -
追踪电子表格中的单元格 Spreadsheet Tracking
思路一:先模拟操作,算出最后的电子表格,讲原始位置的值存在数组中,经过交换,插入,删除等操作后,在操作后的数组下标与数组当中所存在的值(0和原始位置)来查找存在与否或者移动后的位置。思路二:创建结构体,把每组模拟执行的操作信息放在一个结构体中,当查询时再进行每个操作,不需要将整个表的变化进行计算,只需要关注所查询的单元格的位置变化。参考书籍《算法竞赛入门经典》(第二版)原创 2023-12-21 23:28:12 · 404 阅读 · 0 评论