算法
Adellle
山不向我走来,我便向山走去
展开
-
电话号码的字母组合(LeetCode17题)
主要思想就是一条路走到黑,回溯时记得恢复现场。原创 2024-04-04 13:37:38 · 85 阅读 · 0 评论 -
Java中数组和List的互相转换
【代码】Java中数组和List的互相转换。原创 2024-03-14 18:11:46 · 444 阅读 · 1 评论 -
平衡二叉树
2,中序遍历:按左,根,右方式遍历(二分搜索树的特点:从小到大依次输出)1,当前节点的值大于左节点的值,小于右节点的值。2,除过叶子节点 其余非叶子节点都有左右孩子。3,后序遍历:按左,右,根方式遍历。4,先序遍历:按根,左,右方式遍历。注:存储元素的值必须具有可比性。2,每一棵子树也是二分搜索树。1,叶子节点在最后一层。原创 2024-03-09 13:12:20 · 172 阅读 · 0 评论 -
数学之鸡兔同笼问题
假设番茄堡x个,小皇堡y个,可以得出x,y的结果,用题目给的代替,再判断x,y是否符合题目要求,最后返回值。今天的每日一题写的很low,居然没想到鸡兔同笼,还傻傻的模拟!()我的愚蠢写法:(超时)原创 2023-12-25 18:56:48 · 493 阅读 · 0 评论 -
【2023下算法课设】Gray码的分治构造算法
传统的二进制系统例如数字3的表示法为011,要切换为邻近的数字4,也就是100时,装置中的三个位元都得要转换,因此于未完全转换的过程时装置会经历短暂的,010,001,101,110,111等其中数种状态,也就是代表着2、1、5、6、7,因此此种数字编码方法于邻近数字转换时有比较大的误差可能范围。例如长度为2³的格雷码为(000,001,011,010,110,111,101,100),设计分治算法对任意的n值构造相应的格雷码。十进制 格雷码 二进制。原创 2023-12-25 14:43:38 · 610 阅读 · 0 评论 -
LeetCode每日一题(双指针)
使用双指针每次当0的个数达到k,开始反转,返回最大。原创 2023-11-22 17:34:00 · 328 阅读 · 1 评论 -
动态规划基础篇(LeetCode每日一题计划)
方法一:f(x)=f(x-1)+f(x-2)原创 2023-11-11 17:57:30 · 132 阅读 · 0 评论 -
O(1)时间复杂度通过位运算来判断两字符串是否有公共字符方法
使用位运算,创建一个长度为2的数组,每个位置的长度为26,前缀补0,如果当前字符串某个字母存在,则该字母的位置上为1.比较两个字符串所创建的数组,做与运算,结果为1则存在相同字符,否则不存在。判断两个字符串是否有公共字符暴力做法需要O(n^2),而通过位运算优化,可以节省不少时间复杂度。以小写26字母为例,判断两个字符串是否存在公共字符。原创 2023-11-06 16:45:28 · 149 阅读 · 0 评论 -
leetcode421. 数组中两个数的最大异或值
最大运算结果是 5 XOR 25 = 28.的最大运算结果原创 2023-11-05 23:43:18 · 34 阅读 · 0 评论 -
找质数(枚举 埃氏筛 线性筛)
输入一个数,返回小于等于这个数的质数。原创 2023-11-01 19:56:03 · 124 阅读 · 0 评论 -
134. 加油站
你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油。开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油。开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油。开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油。开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油。原创 2023-10-20 18:16:34 · 127 阅读 · 0 评论 -
优先队列排序(JAVA)
所以使用优先队列(这里是大根堆),每次取出队头,取出之后再插入它的三分之一向上取整。思路:执行k次,每次取出数组中的最大值,结果需要和最大值/3向上取整求和。返回的数组的运行时类型是指定数组的运行时类型。检索但不删除此队列的头,如果此队列为空,则返回。检索并删除此队列的头,如果此队列为空,则返回。从该队列中删除指定元素的单个实例(如果存在)。返回一个包含此队列中所有元素的数组。将指定的元素插入到此优先级队列中。如果此队列包含指定的元素,则返回。将指定的元素插入到此优先级队列中。返回此队列中的元素的迭代器。原创 2023-10-18 19:54:22 · 71 阅读 · 0 评论 -
每日一题(刷题记录)
11/7打卡,好久没打卡啦,但每天都坚持在刷题哦~我觉得最大的进步不是只做自己会的,而是去接受自己不会的,做自己从未做过的~打破舒适圈~!给定数组表示研究者总共有 5篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5次。方法调用返回大于或等于e的最小元素,如果没有这样的元素则返回null。对列表排序(暴力做法)(想念c++的第10086天~呜呜呜)篇论文被引用的次数。模拟题(今天的代码越写越长就离谱,纯纯模拟了)你必须实现类的所有函数,并满足每个函数的。利用归并排序的思想,返回最中间的中位数。原创 2023-10-07 10:15:00 · 176 阅读 · 0 评论 -
树状数组,动态求连续区间和
思路:如果用前缀和算法的话,时间复杂度为O(N),使用树状数组时间复杂度为O(log N),(哪个更快不用多说了吧^-^)树状数组即树形结构的数组。定义两个数组:a[N],c[N]。a数组为原数组,c数组为树状数组。1, 树状数组层数的确定:二进制末尾0的个数。(使用lowbit函数即可)第0层(上图黑色):二进制末尾0个0(后面以此类推)给某个位置上的数加上某个数。快速求某区间前缀和。区间修改,区间查询;单点修改,区间查询。2,在某个位置加上v。3,求区间1~x的值。原创 2023-01-30 15:45:59 · 81 阅读 · 0 评论 -
前缀和与差分
快速求数组一段区间的和。(计算一段区间和如果逐个相加非常耗时)一维(计算l->r的区间和)二维 (计算二维数组(x1,y1)->(x2,y2)的区间和)一维前缀和(求解一维--l到r的区间的和)解析:暴力求法即每次从l到r逐个相加,即可求得区间和。而前缀和类似于求前n项和,计算每个元素的前n项和,变成区间和只要减去前(l-1)的区间和即可求得l到r的和。给定一个长度为 n 的正整数序列 a1,a2,…,an。原创 2023-01-16 00:25:20 · 152 阅读 · 0 评论 -
周赛补补合集
错题题库原创 2023-01-11 03:12:10 · 85 阅读 · 0 评论 -
斐波那契递归版和非递归版
输入一个整数 nn ,求斐波那契数列的第 n 项。假定从 0 开始,第 0 项为 0。原创 2022-11-27 18:47:47 · 88 阅读 · 0 评论 -
快速幂整理
位运算基本使用方法:二进制左移×2,右移➗2。①计算base的power次方。②计算高精度a*b%p。1,暴力 O(n)原创 2022-11-21 23:19:10 · 115 阅读 · 1 评论 -
盛金公式 C++(求解一元三次方程的求根公式)
提示:记方程 f(x) = 0f(x)=0,若存在 22 个数 x_1x1 和 x_2x2,且 x_1 < x_2x1原创 2022-11-19 00:20:46 · 1347 阅读 · 0 评论 -
数的范围(二分详解)
对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。就可以了,因为是向下取整,又因为r和l更新的值的缘故不会陷入死循环。给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。接下来 q 行,每行包含一个整数 k,表示一个询问元素。第一行包含整数 n 和 q,表示数组长度和询问个数。原理:就是找到最左端第一个小于等于x的数的位置即在。原创 2022-11-06 01:21:12 · 541 阅读 · 0 评论 -
区间DP----分而治之
求一段区间的最小价值。因为每次只能合并相邻两堆石子,所以跟区间合并的贪心问题略有区别。因为是每次合并两端相邻石子堆,所以最后一定也剩下左右两堆合并。所以利用分而治之的思想。每次都寻找合并价值最小的石子堆,最后也就能求出总的石子堆合并的最小价值。原创 2022-09-05 09:44:13 · 146 阅读 · 0 评论 -
动态规划之背包问题
1)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法2)动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。3)与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )4)动态规划可以通过填表的方式来逐步推进,得到最优解.原创 2022-09-04 15:49:48 · 632 阅读 · 0 评论 -
扩展欧几里得算法通解
将上述式子等式变形可得:ax+by=m。再由欧几里得算法可得:m%gcd(a,b)=0时有解,可求得x,y。此时的x,y为ax+by=gcd(a,b)时的x,y。原创 2022-08-30 19:59:27 · 291 阅读 · 0 评论 -
高斯消元(解线性方程组)
观察倒三角,我们可以得到Xn,从最后一个等式向上代换,可依次求解Xn-1,Xn-2...X2,X1。如图为n行等式,其中有n个未知数,我们知道n个方程解n个未知数。如果上述的倒三角是一个完美的阶梯型,那么该方程组存在唯一解;但是解方程组时存在无解或者有多组解的情况。③将该行第一个数变成一(需保证等式恒成立)如果ai*Xi=0,那么存在无穷解。④将当前下面所有行的第c列的数消成0。③将某行的若干倍加到另一行去。如果0*Xi=bi,那么无解;①把某一行乘以一个非零的数;这就是所谓的高斯消元。原创 2022-08-22 22:42:02 · 775 阅读 · 0 评论 -
数字三角形问题(线性DP)
线性DP是动态规划问题中的一类问题,指状态之间有的动态规划问题。动态规划的算法思想就是将待求解的问题分解成较小且相同子问题,最终产生整体最优解。经典问题有。题目意思自上而下走,每次只能向左下或者右下,找出计算之和最大值输出。解析自下而上,更改每次的状态——最大值(子问题),求出每个位置的最大值,最终得出第一个位置的最大值。以例题为例如下图所示左边是数塔,右边是每次更新的最大值的状态,最终在f[1][1]位置即是整个数塔的最大值,输出即可。...原创 2022-07-31 16:36:32 · 940 阅读 · 0 评论 -
单源最短路且存在负权边的SPFA算法(Bellman-Ford算法的优化版)
SPFA算法时间复杂度:一般O(n),最坏O(m*n);SPFA算法即可以计算Dijkstra算法能解决的所有边都是正权问题,也可以解决存在负权边的问题。用宽搜处理SPFA算法,所以大致的入队情形与bfs差不多。具体做法: 1,起点入队; 2,遍历与队头相邻的点,更新最短距离。例题: spfa求最短路给定一个n个点mm条边的有向图,图中可能存在重边和自环,边权可能为负数。请你求出11号点到nn号点的最短距离,如果无法从11号点走到nn...原创 2022-07-21 11:30:50 · 383 阅读 · 0 评论 -
单源最短路且存在负权边的Bellman-Ford算法
单源最短路且存在负权边的Bellman-Ford算法,Dijkstra算法和Bellman-Ford算法都是求单源最短路的算法,但区别就是前者所有权边均为正数,后者可以存在负权边。由此可知思想上存在的区别。Dijkstra算法就是每次通过为每个顶点保留目前为止最短路径来工作。而Bellman-Ford算法由于存在负权边,用Dijkstra算法处理负权边不一定能找到最短路径,下面来讲讲Bellman-Ford算法的思想和例题。...原创 2022-07-19 16:29:33 · 1112 阅读 · 0 评论 -
解决单源最短路径的Dijkstra贪心算法(堆优化版)
3,由于题目说明有重边和自环,我们又发现在小根堆中最短距离一定是在前面先遍历的并且被标记,所以后面的距离大的重边直接continue即可。接下来mm行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出−1。三,priority_queue(优先队列)(小根堆,大根堆,小顶堆,大顶堆)2,用优先队列来表示堆,我们应该选择小根堆,因为每次寻找距离最短的点。push_front();...原创 2022-07-15 23:25:20 · 625 阅读 · 0 评论 -
解决单源最短路径的Dijkstra贪心算法(朴素版)
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。输入格式第一行包含整数 n 和 m。接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。输出格式输出一个整数,表示 1 号点到 n 号点的最短距离。如果路径不存在,则输出 −1。数据范围1≤n≤500,1≤m≤105,图中涉及边长均不超过10000。输入样例:输出样例:......原创 2022-07-14 17:35:55 · 299 阅读 · 0 评论 -
有向图的拓扑排序
拓扑排序(有向无环图)原创 2022-07-13 18:56:42 · 1240 阅读 · 0 评论 -
深度优先搜索(dfs),宽度优先搜索(bfs),深度优先遍历,宽度优先遍历
DFS,BFS,树与图的深度优先遍历,树与图的广度优先遍历,树的重心,八数码,走迷宫,n皇后,全排列经典例题。原创 2022-07-09 11:26:15 · 2270 阅读 · 0 评论 -
广度优先搜索(BFS)(队列实现) 走迷宫
BFS应用:寻找最短路径或者遍历路径。(树,图或者更抽象的...)实现方法:队列为什么bfs需要队列实现? 队列的原理是先进先出,而广度优先搜索类似于树的层次遍历,从离根节点最近的点开始向外扩散,因此用队列将最先遍历的点存入,后遍历的点后存入,符合bfs的逻辑。经典例题:走迷宫学习中遇到的几个问题:1,如何表示迷宫走的方向?——通过向量表示,dx,dy一一对应; 分别是四个方向:向上/下/左/右;2, 如何确保最后返回的一定是最短路径?———因为bfs是广度优先搜索,一定是从最近的点开始向外扩散,在b原创 2022-06-25 01:02:39 · 4149 阅读 · 3 评论 -
表达式求值(栈&&哈希实现)
问题:用中序遍历顺序计算表达式例如 输入:788*99+(50/2)-77+1000 输出:78960eval()函数用来计算想计算的位置,最后存入整型栈内运算符优先级表示方法:char表示key(键值),通过键值寻找符号代表的数字,以此来比较运算符优先级。 一个表达式中,无非四种情况。 1,数字;2,左括号;3,右括号;4,运算符。 ①当字符为数字时用while将连续数字字符相加,赋值给一个int型;(注意最后要再给j-1,因为多走了一步,详细看代码)②当字符为左括号时无需任何操作,只要存入字原创 2022-06-20 18:00:25 · 96 阅读 · 0 评论 -
并查集之合并集合
暴力算法: 1,判断两个元素是否在一个集合内: arr[x]=x;if(arr[x]==arr[y])cout并查集优化并查集: 1,合并两个集合; 2,判断两个元素是否在一个集合内。如图所示:假设有四个集合,分别为{1},{2},{3},{4},用树来表示即为四个根节点。我们给每个......原创 2022-06-11 21:15:12 · 615 阅读 · 0 评论 -
字典树(Trie树)字符串统计
字典树:单词查找树,Trie树。树形结构,哈希树变种。应用:典型应用于统计,排序,保存大量字符串(也不仅限于字符串),例如数字,最大异或对等。优点:利用字符串公共前缀有效减少查询时间,查询效率高于哈希树。基本操作:查找,插入,删除。现在以字符串统计为例,构建一个字母字典树,根节点不存,每个节点代表一个字母其余每个节点都有26个儿子(26个字母),insert操作插入字母,每插入一个字母就使该节点生成一个儿子,构成一个树。search操作查找字母出现次数,最后返回。原创 2022-05-31 22:44:57 · 183 阅读 · 0 评论 -
KMP算法----字符串匹配的优化算法
kmp算法 字符串匹配优化原创 2022-05-27 23:27:37 · 189 阅读 · 0 评论