算法集合
文章平均质量分 96
持续更新,包括双指针,滑动窗口,二分查找,哈希,前缀和,模拟,位运算,优先级队列,栈等算法
与你日常
擅长C/C++和数据结构,Linux系统编程,Linux网络编程,MySQL数据库
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法学习(17)—— FloodFill算法
这道题描述不好懂,这里来解释一下:给我们一个矩阵,里面的数字相当于海平面高度,左边和上面代表太平洋,右边和下面代表大西洋;水可以从高往低处流,如果数字相等也可以流,然后题目就是要我们找到所有的水可以同时流向两个大洋的坐标。题目给我们一个二维矩阵,由两个值填充,1表示陆地,0表示水,题目要我们找出有多少个陆地组成的岛屿,如示例二,有3个陆地;原创 2024-12-25 20:33:25 · 819 阅读 · 0 评论 -
算法学习(19)—— 队列与 BFS
bfs又称宽搜,全称是“”,然后就是关于bfs的三个说法:“宽度优先搜索”,“宽度优先遍历”,“层序遍历”,这三个都是同一个东西,前面我们介绍了大量的深度优先遍历的题目已经衍生算法,对这类比较熟悉的纯队列的题目很少很少,队列这种数据结构大部分都是用来服务BFS算法的,所以我们就把BFS和队列放一起来介绍。和深搜一样,宽搜不仅仅只应用在树形结构中,这篇文章只列举了部分在树中的应用,先熟悉下BFS算法,后面会再展开细讲。原创 2024-12-29 22:08:51 · 1067 阅读 · 0 评论 -
算法学习(18) —— 记忆化搜索
遇到一个新概念时,直接死念八股文是效果甚微的,所以我们直接通过第一个题目来深入了解记忆化搜索。这道题是动态规划最经典的一道题,这里我们尝试用记忆化搜索来解决下这道题。(i == 0 || j == 0) 时,return 0。这道题也有解法三,也就是动态规划,我们到后面再详细了解。enmm,这道题的题意看着就难受。那么这个暴搜能否用记忆化搜索来优化呢?:如何实现记忆化搜索?原创 2024-12-26 17:27:26 · 950 阅读 · 0 评论 -
算法学习(22)—— BFS解决最短路问题
为什么第一次碰到终点时就可以宣布找到最短路了呢?: 感性理解下,A点到I点有4条路,假设有4个速度相同的人同时从起点A出发,由于速度相同,单位时间内可以看作4个人的移动距离是相同的,所以在这种情况下,谁先到达终点,那么这个人所花费的时间就是最少的,所以这个人走的这条路就是最短的:如何找出最短路的长度呢?: 由于权值为1,所有路径的长度都是相同的,所以扩展的层数再乘以权值就是最短路的长度。原创 2025-01-05 17:41:29 · 1243 阅读 · 0 评论 -
算法学习(23)—— 多源BFS问题
给我们一个二进制矩阵,0表示海洋,1表示陆地,可以从任意一个陆地的上下左右四个方向移动,一次移动是从一个1走到另一个相邻的1,返回无法在任意次数的移动中离开网格边界的陆地单元格的数量。这道题和前面的也几乎是一样的,但是有一点点差别,这道题要我们找到离海洋最远的那个陆地,最后要我们返回这个最远的距离,如果全是海洋或全是陆地返回-1。原创 2025-01-08 17:38:46 · 1001 阅读 · 0 评论 -
算法学习(21)—— BFS解决FloodFill问题
下面是用bfs宽搜来解决的实例。原创 2025-01-04 16:50:47 · 396 阅读 · 0 评论 -
算法学习(20)—— 优先级队列
1046. 最后一块石头的重量 - 力扣(LeetCode)给我们一个正数数组,每一次循环,都需要找到最大的两个数,如果这两个数相等,那么这两个数就全干掉;如果一个数比另一个数大,小的数会被干掉,大的数会被 -= 小的数。这类题就算典型的TopK问题,就要我们找“前K个”最大或最小的元素,这类题我们一般用堆来做,优先级队列的底层就是调用的堆排序我们只需要搞一个堆,堆顶的元素就是我们的最大值;只要每次把两个数放进这个堆里,取两个堆顶元素,如果相等,就都pop掉;原创 2024-12-30 17:11:31 · 978 阅读 · 0 评论 -
算法学习(十五)—— 回溯算法
这些名词最开始学算法的时候看着可能一头雾水,但是本篇文章已经是第15篇了,这一路下来可以发现,上面这些名词其实很不是很神秘,深搜就是二叉树递归,回溯就是往回走,剪枝就是加几个判断而已。下面我们通过两非常典型的回溯的例题来全面搞懂这些东西。原创 2024-12-10 10:48:43 · 652 阅读 · 0 评论 -
算法学习(十四)—— 二叉树的深度搜索(DFS)
在后面的难度较高的递归回溯题目的时候,有了“回溯 --> 恢复现场”的思路之后,写代码的过程才会有思路,并且,一旦我们在题目中用到了全局变量,那么恢复现场的操作就会显得很重要。这道题我们主要是理解三个点:①理解全局变量的优势 ②回溯 ③剪枝;网上很多人在自学算法的时候,都是看到了代码中有“恢复现场”的操作,才知道这道题用了“回溯”,所以很多人以为的就是“前面两道题我们提到了三个词:①全局变量 ②回溯 ③剪枝,其中回溯有个性质叫做“恢复现场”题目有点长,得结合示例来理解。原创 2024-12-09 19:41:27 · 1107 阅读 · 0 评论 -
算法学习(十三)—— 递归
循环(迭代)vs 递归用递归解法的核心就是“要找到重复的子问题”,所以循环和递归都是解决重复的子问题,所以这两个方法是可以相互转换的,只是递归的代码更少更简单,但是背后的逻辑更复杂问题:什么时候循环舒服,什么时候递归舒服?解答: 以dfs为例如果用循环,则需要借助一个栈来完成,因为我们遍历完左子树后,需要返回到上一个节点去找右子树,所以需要栈来保存一下,方便遍历左子树之后直接去遍历右子树如果用递归的话,几行就可以搞定,但是用循环就可能需要几十行结论:当展开图比较复杂时,建议用递归;原创 2024-12-06 19:03:52 · 939 阅读 · 0 评论 -
算法学习(十二)—— 递归,搜索,回溯前置
什么是递归?:递归就是函数自己调用自己的情况:为什么会用到递归:如何理解递归:如何写好一个递归?:力扣的题目开头会提示用什么什么解法,但是面试的时候没有的。原创 2024-11-11 16:12:04 · 808 阅读 · 0 评论 -
算法学习(十一)—— 栈
关于栈这个数据结构这里就不多说了,而且栈也是个并不复杂的数据结构,可以直接封装一个数组来实现栈的各种功能,关于栈的题目也不是特别难,难就难在我们看到一个题目,如何才能想到用栈来解决。原创 2024-11-09 15:23:04 · 855 阅读 · 0 评论 -
算法学习(十)—— 字符串
这类题一般是和其它算法合起来,比如模拟,双指针,动态规划或者回溯等,所以字符串相关的题目类型一般是非常非常丰富的,这里我们选取几道经典的题目进行讲解。原创 2024-11-06 17:52:44 · 885 阅读 · 0 评论 -
算法学习(九)—— 哈希表
正向的话就需要事先就把所有的数都扔哈希表里去,假设target = 8,然后数组中恰好有一个4,这时候去哈希表里去找就会找到两次4,所有这里需要加个判断。当我们需要“频繁”地去查找某一个数地时候,我们就要想到使用哈希表。有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。哈希表能够“快速”查找某个元素,能快到O(1)的事件复杂度。:为什么原始的正向枚举配合哈希表的策略没反向枚举好呢?原创 2024-11-05 18:42:18 · 734 阅读 · 0 评论 -
算法学习(八) —— 链表
画图!!因为数据结构的题目只要能通过画图来理解,理解成本是非常低的,而且也能记得更牢,因为画图 --> 直观 + 形象 --> 便于理解引入虚拟“头”结点,链表类的算法题,一般都是不带头结点的单向链表,就是从第一个节点就已经存入有效数据了,所以 这种链表需要考虑很多的边界情况,比如null空指针,而且有些题目的测试用例会一开始就给你传入一个空指针;所以我们自己创建一个哨兵头结点,然后用这个头结点就可以很方便处理边界情况不要吝啬空间,能定义变量就定义快慢双指针。原创 2024-11-05 11:27:56 · 957 阅读 · 0 评论 -
算法学习(七)—— 分治
分治,就是“分而治之”的意思,就是把一个大问题,转化为若干个相同或者相似的几个子问题,然后在子问题的基础上再进行划分,直到能够快速一个子问题时停止划分我们的快速排序和归并排序就是典型的分治思想。原创 2024-11-03 10:56:50 · 1197 阅读 · 0 评论 -
算法学习(六) —— 模拟运算
模拟算法,通俗来讲就是“比葫芦画瓢”,特点就是:“思路比较简单”,直接根据题目要求来这个算法考察的就是我们的。原创 2024-10-28 15:14:23 · 1108 阅读 · 0 评论 -
算法学习(五)—— 位运算
①基础位运算我们前面用到的位运算符有很多,左移(<<),右移(>>),按位取反(~)就不讲了,我们来简单复习下按位与(&),按位或(|),按位异或(^),这三个是刚学位运算时比较容易混淆的三个0 & 0 = 00 & 1 = 01 & 1 = 10 | 0 = 01 & 0 = 11 | 1 = 10 ^ 0 = 01 ^ 0 = 11 ^ 1 = 0②给一个数n,确定它的二进制表示中的第 x 位是 0 还是 1假设n是:10 0 1,二进制表示中最右边是低位,从右往左开始,一共32位。原创 2024-10-24 15:19:27 · 1179 阅读 · 0 评论 -
算法学习(四)—— 前缀和算法
(文章的题目解释可能存在一些问题,欢迎各位小伙伴私信或评论指点(双手合十))原创 2024-07-17 01:21:55 · 1263 阅读 · 0 评论 -
算法学习(三)—— 二分查找算法
/根据二段性,填入具体的条件即可while(left原创 2024-07-11 22:08:44 · 1959 阅读 · 0 评论 -
算法学习(二)—— 滑动窗口算法
解释下这道题:给一个字符串,找出不含有重复字符的最长字串的长度,假设输入s="abcabcbb",因为无重复字符的最长字串是“abc”,所以返回3,s="bbbb",返回1;该题标着困难难度,但其实难度远没有上面两题高,这题最多算中等难度,下面来解释下题目:给给一个字符串s,一个字符串t,返回s中覆盖t所有字符的最小字串,如果不存在就返回空串。②s="abab" p="ab" 输出[0, 1, 2] 因为起始索引012的字串分别位"ab""ba""ab",都是"ab"的异位词。原创 2024-06-25 11:07:59 · 939 阅读 · 0 评论 -
算法学习(一)—— 双指针算法
解释一下题目:给你一个数组,在这个数组中随便选三个数使它们的和为0,并且三个数互不相同,返回所有相加为0的三个数组合,顺序没有要求但是元素的下标不能一样,假设输入:[-1, 0, 1, 2, -1, -4] ,我们可以选出三个[-1, 0, 1] [-1, 2, -1] [0, 1, -1]但是只返回前两个,是因为第三个和第一个顺序不一样,但是元素一样的,这样的情况我们二选一返回。和如名字一样,两个指针在顺序结构的同一端同时移动,一个指针一次往后移动一次,一个一次移动两次。该算法非常适合用于处理。原创 2024-06-23 19:15:39 · 1559 阅读 · 0 评论
分享