
算法
文章平均质量分 91
敲上瘾
热爱生活,热爱学习,热爱世界
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
子数组问题——动态规划
用动态规划做子数组类的题时,对于状态表示我们可以直接设:dp[i]为以i元素结尾的子数组的... ... 后面就根据具体的题目要求填写,可能是子数组的和或者子数组的积等等,无论如何都可以以i元素结尾的子数组为研究对象去思考问题,如果解决不了就尝试增加状态,但研究对象不要改变。如果还解决不了那么再考虑改变或增加研究对象。原创 2025-03-06 10:17:42 · 7805 阅读 · 55 评论 -
多状态dp——动态规划
每个状态点需要维护多个子状态,分别表示不同情境下的最优解。例如,股票买卖问题中,每个时间点需记录「持有股票」和「未持有股票」两种状态下的最大收益。:将问题划分为多个互相影响的状态。例如:股票问题:持有、未持有、冷冻期。粉刷房子:当前房子涂红、蓝、绿时的最小成本。:每个子状态的值需根据前一步其他子状态计算。例如:当天持有股票的最大收益 = max(前一天已持有继续持有, 前一天未持有当天买入)。原创 2025-02-26 10:08:29 · 1245 阅读 · 47 评论 -
基础dp——动态规划
动态规划(Dynamic Programming,简称dp)是一种通过将复杂问题分解为更小的子问题来解决的算法思想,尤其适用于具有重叠子问题和最优子结构的优化问题。其核心目标是避免重复计算,通过存储中间结果(记忆化)来提升效率。动态规划 vs 分治法共同点:都将问题分解为子问题。区别分治法(如归并排序)的子问题独立,无重叠,无需存储中间结果。动态规划的子问题有重叠,需存储中间结果避免重复计算。原创 2025-02-23 08:26:44 · 3366 阅读 · 46 评论 -
FloodFill算法——搜索算法
FloodFill算法字面意思就是洪水灌溉法,比如我们有这么一块地:0表示平原,正数表示高地,负数表示凹地,那么当洪水来临时这些凹地会被优先灌满。而我们要找的正是这些联通块,如:它是一种暴力搜索的思想,只要我们把每个地方都搜索一遍,那么最终的结果必定会水落石出。通常可以使用BFS、DFS或并查集解决。接下来我们直接从题中感受。原创 2025-02-13 10:01:36 · 1021 阅读 · 42 评论 -
DFS+回溯+剪枝(深度优先搜索)——搜索算法
递归是这样理解把它拆分出来,两个字,递和归递递推这就需要找到递推公式归回归需要找到回归条件,递推过程逐渐逼近回归条件直白一点来说就是,一个函数自己调用自己的情况,当然一定是要能够返回的。二叉树的遍历,快排,归并中都用到了递归。原创 2025-02-10 10:03:35 · 1888 阅读 · 36 评论 -
BFS(广度优先搜索)——搜索算法
BFS,也就是广度(宽度)优先搜索,二叉树的层序遍历就是一个BFS的过程。而前、中、后序遍历则是DFS(深度优先搜索)。从字面意思也很好理解,DFS就是一条路走到黑,BFS则是一层一层地展开。原创 2025-02-03 10:14:43 · 3370 阅读 · 59 评论 -
分治算法——优选算法
本章我们要学习的是分治算法,顾名思义就是分而治之,把大问题分为多个相同的子问题进行处理,其中我们熟知的快速排序和归并排序用的就是分治算法,所以我们需要重新回顾一下这两个排序。原创 2025-01-09 09:15:48 · 2035 阅读 · 57 评论 -
一.排序问题 及 二分法查找。
从所有个元素中找出最小的元素与第一个元素交换,那么现在第一个是有序,我们从第二个开始找,找到最小的一个与第二个元素交换,现在前两个就是有序的了,以此类推循环下去直到进行到最后一个这串元素就排好了。原创 2024-01-10 22:53:16 · 3614 阅读 · 4 评论 -
双指针——优选算法
1、以上三道题分别对应数组划分、数据的单调性、数据的循环,在以后涉及这种类型题的时候都可以从双指针方向去考虑。2、对于能使用暴力枚举解决的问题也可以考虑使用双指针去降低时间复杂度提高效率。3、通常所说的双指针算法只是一种思想并不是用真的使用指针。原创 2024-09-02 09:12:52 · 1844 阅读 · 112 评论 -
滑动窗口——优选算法
相对于暴力解法而言滑动窗口本质其实是减少不必要的枚举,那么当我们做题时一眼看不出可以使用滑动窗口或者知道要使用滑动窗口但不知道如何用的时候,我们就可以从暴力枚举的角度出发,从暴力中的寻找规律并优化。原创 2024-09-09 11:16:45 · 2113 阅读 · 110 评论 -
前缀和算法——优选算法
前缀和是指从数组的起始位置到某一位置(或矩阵的某个区域)的所有元素的和。这种算法通过预处理数组或矩阵,计算出每个位置(或区域)的前缀和,并将其存储在一个额外的数组或矩阵中,以便在后续查询中可以快速获取任意区间(或区域)的和。对于一维数组,可以使用递推公式来计算前缀和;对于二维矩阵,可以使用类似的递推公式,但需要考虑更多的边界情况。接下来我会用两个题来详细讲解前缀和的使用。原创 2024-10-11 12:03:02 · 2663 阅读 · 90 评论 -
二分算法——优选算法
1、二分算法并不局限于数组有序,在要找到数据的二段性即可使用二分算法。2、二分算法模板2.1.朴素二分模板else ...2.2.左边界查找模板2.3.右边界查找模板。原创 2024-09-16 09:43:19 · 1830 阅读 · 103 评论 -
位运算——优选算法
按位与:&两者为真(1)才为真(1),也可以理解为只要有假(0)就一定为假(0),如下:按位或:|只要有一个是真(1)则为真(1),否则为假(0)按位异或:^相同为假(0),相异为真(1),如下:1==异或(^)运算规律:对任意常数a,b,c有:按位取反:~真(1)变为假(0),假(0)变为真(1),如下:位运算的优先级关于位运算的优先级是一个让人很头疼的事情,不过也很好解决,直接简单粗暴多加括号就行,就像写宏定义一样。原创 2024-10-23 13:08:15 · 3214 阅读 · 74 评论 -
二叉树创建和遍历
二叉树遍历,广度优先遍历,深度优先遍历,层序遍历,二叉树总节点个数计算,二叉树深度计算,叶子节点个数计算原创 2024-06-03 10:50:31 · 2241 阅读 · 133 评论 -
二叉树的分层遍历、栈的压入弹出序列
本章主要来讲解两个OJ题,针对每个OJ题我分三部分来解决,分别是题目解析(主要弄清楚题目要求我们解决什么问题),算法原理,代码编写,接下来让我们进入正题。原创 2024-08-24 16:25:41 · 922 阅读 · 82 评论 -
堆(建堆算法,堆排序)
堆就是完全二叉树,而且是一种特殊的完全二叉树它需要满足每一个父节点都大于子节点,称为大堆或每一个父节点都小于子节点,称为小堆。而对兄弟节点之间的大小关系并没有要求(为此它并不是有序的)。原创 2024-05-27 07:45:48 · 2491 阅读 · 194 评论 -
链表经典面试题
反转链表,回文链表,相交链表,环形链表,带环链表,合并两个有序链表,双指针,快慢指针,面试题,栈空间,追击问题,中间节点的查找,暴力算法,结构体指针数组,数据结构,OJ题原创 2024-05-06 11:51:01 · 3638 阅读 · 203 评论 -
栈和队列OJ题
如果要用队列实现栈的话,使用一个队列是肯定不行的,队列结构是先进先出,栈结构是先进后出,所以我们要做的就是使用两个队列实现元素的先进后出的功能,要实现出栈操作我们只要,把左边栈的元素逐个导入右边队列中,直到剩下最后一个,再将它取出相当于出队操作。End和Head指向同一位置的时候栈为空的情况,比如原来队列需要的是k个空间,那么我们可以创建k+1个空间,那么我们就可以。用栈实现队列也就是使用栈来实现先进先出的效果,该操作用一个栈是无法完成的,我们考虑用两个栈,栈a用来模拟入队操作,栈b来模拟出队操作。原创 2024-05-20 10:03:58 · 971 阅读 · 78 评论 -
爬楼梯问题(4种解法)
递归 记忆递归 滚动数组 动态规划 斐波那契原创 2024-02-01 20:15:08 · 2821 阅读 · 0 评论 -
【排序算法】—— 快速排序
快速排序,霍尔法,挖坑法,前后指针法,小区间优化,三数取中,快速排序非递归,快速排序递归,快速排序的优化,快速排序提高效率的方法原创 2024-07-07 22:43:39 · 12492 阅读 · 89 评论 -
【排序算法】—— 归并排序
归并排序,排序,归并排序非递归,有序数组排序,外排序算法原创 2024-07-15 19:14:26 · 1814 阅读 · 60 评论 -
【排序算法】—— 希尔排序
希尔排序是简单插入排序的一种升级版,它也是用了插入的思想,而插入排序相比冒泡排序和选择排序的效率要高的多,再将它优化为希尔排序后效率跟原来根本就不在一个级别。接下来我们就一起来学习一下希尔排序。原创 2024-06-25 09:24:27 · 2157 阅读 · 87 评论 -
【排序算法】—— 计数排序
计数排序,顾名思义就是记录数据出现的次数进行排序,空间复杂度为O(N)。只能用于整型,对于比较集中重复率比较高数据更为适用。原创 2024-07-18 19:13:00 · 2002 阅读 · 67 评论