算法刷题
文章平均质量分 75
材化胖虎
这个作者很懒,什么都没留下…
展开
-
KMP算法
定义主串指针i(初始化0), 子串指针j , 不断比较主串和子串每个字符是否一致,如果一致,继续比较,如果不一样,主串指针变成1,子串指针变成0,从新开始比较。如图,匹配失败之后,保持指针i 不变,尽可能移动子串的指针到有效的匹配位置(这个意思是指,i前面两位已经匹配成功了,不需要额外进行比较了。KMP其实是对上面的暴力求解进行了改进,利用的是匹配失败之前,匹配成功的信息。比如求子串在主串中出现的起始位置,子串在主串中出现的次数等等。其实求next数组,可以看做是两个相同的字符串自己和自己比较。原创 2024-06-04 20:25:51 · 390 阅读 · 1 评论 -
LeetCode刷题--- Dijkstra 求最短路径
比如我们求从0 到其他点的最短距离,定义一个数组,第0行分别是每个节点,第一行是0到其他节点的距离,初始化为正无穷大,第三行是表示是否已经是最小距离。因为从1到2的距离是2+1,小于当前的5,因此可以刷新下表,此时得到了0到2最短距离3。思路就是上面的思路,不断的获取距离,然后和当前的距离比较,如果比他小,就更新进去。首先遍历0能够直接到达的顶点,修改如下,此时0到1的距离是最短的,可以标记为T。个人感觉,邻接矩阵适合无向图,邻接表适合有向图。然后看从2出发,能够直接到达的距离。原创 2024-03-27 17:50:52 · 491 阅读 · 0 评论 -
LeetCode刷题,最小路径和,从记忆化搜索到动态规划
因为机器人每次要么向下走,要么向右走所以可以转换为求grid[0][0] + 右边矩阵网格和下方矩阵网格的最小值。1、如果当前位置已经在grid右下角了,说明是最后一步了,可以取当前值跳出递归。,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。2、走到了边界,没办法继续往右或者往下走了。一个机器人每次只能向下或者向右移动一步。给定一个包含非负整数的。【递归+记忆化搜索】原创 2024-03-24 23:55:13 · 311 阅读 · 0 评论 -
LeetCode 刷题-322, 从递归到记忆化搜索到动态规划
上述递归调用,并不能完全通过用例,从给出来的图也可以看出,递归的过程中是有很多节点进行了重复计算的,那么可以进行优化,定义一个数组,用于存放计算过的节点数据,这样递归的过程中,如果发现已经计算过了,直接从数组中取值就可以了,不需要重复计算。拿到这个题,一开始考虑的是用贪心算法,即每次尽可能取最大的硬币,但是这种思路有个很大的问题,就是每次取最大的值,计算到后面不一定能拼出等于amount的解。本题其实也就是找路径的问题,可以看做是一个树形结构。,表示不同面额的硬币;你可以认为每种硬币的数量是无限的。原创 2024-03-24 22:05:43 · 490 阅读 · 0 评论 -
LeetCode 刷题 --- 快速幂
1、首先假设给定三个正整数 a,b,,c,满足 a原创 2024-03-20 16:39:47 · 718 阅读 · 0 评论 -
LeetCode刷题 -- BFS
如果我们只是为了遍历一棵树、一张图上的所有结点的话,那么 DFS 和 BFS 的能力没什么差别,我们当然更倾向于更方便写、空间复杂度更低的 DFS 遍历。不过,某些使用场景是 DFS 做不到的,只能使用 BFS 遍历。这就是本文要介绍的两个场景:「层序遍历」、「最短路径」。原创 2022-11-02 21:09:21 · 670 阅读 · 0 评论 -
LeetCode刷题 --- 前缀和
定义:前缀和是一种重要的预处理,能大大降低查询的时间复杂度。结合Hash缓存,能够进一步优化提升算法执行效率同余定理:如果两个数被同一个数整除后,余数相同,那么这两个数的差值可以被该数整除推理公式: (sum[i] - sum[j]) % k == 0sum[i] % k ==sum[j] % k演变:如果数组前(i-1)个数字的和整除k后余数为r,那么前r个数字的和整除k后余数为(r+nums[i])%k;原创 2022-10-21 16:15:31 · 1265 阅读 · 1 评论 -
LeetCode刷题 --- 滑动窗口
滑动窗口法也叫尺取法(可能也不一定相等,大概就是这样),可以用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题。由于区间连续,因此当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝,这样便减少了重复计算,降低了时间复杂度。往往类似于“请找到满足xx的最x的区间(子串、子数组)的xx”这类问题都可以使用该方法进行解决。原创 2022-10-21 11:02:14 · 899 阅读 · 0 评论 -
LeetCode刷题 -- 二分法
二分查找也称为折半查找,时间复杂度O(logn),是一种较为快速的查找算法。【使。。最大值尽可能小】【最小值尽可能大】等是二分搜索中常见的问法,想要应用二分查找,前提条件是必须具备如下特征: 1、数据在数组中 2、数据有序排列原创 2022-10-18 21:37:47 · 330 阅读 · 0 评论 -
LeetCode刷题 -- 分治算法
就是把一个复杂的问题分成两个或者更多相同或者相似的子问题(分),在把子问题分成更小的子问题...一直到最后的子问题可以简单的直接求解出来,那么原问题的解就是分出来的这些子问题的合并(治)。n为偶数时:x^n = x^(n/2) * x^(n/2) ===》这个场景不需要考虑n的正负。x^n = x^(n/2) * x^(n/2) * x ===》n为正数。x^n = x^(n/2) * x^(n/2) / x ===》n为负数。3、合并:将已求解的各个子问题的解,逐步合并为原问题的解。原创 2022-10-13 20:22:10 · 326 阅读 · 0 评论 -
LeetCode 刷题 -- 递归
在上述代码的递归调用里,调用的是f(n-1)和f(n-2),但是在f(n-1)的递归里面,f(n-2)其实已经计算过了,但是后面还会重复计算。如果最后一步走1个台阶,那么就是n=n-1时候的方法,如果最后一步走2个台阶,那么就是n=n-2的方法,因此 f(n)=f(n-1)+f(n-2)3、如果只有一个节点为null,这种是需要调换左右节点的,假设左节点不为null,右节点为null,那么调换之后,左节点为null,右节点不为null,因此可以不需要特殊处理。)同时,这个节点的子节点也要进行相同的操作。原创 2022-09-28 21:55:33 · 1220 阅读 · 0 评论 -
LeetCode刷题 --- 哈希表
除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。对字符串做一个分割,然后遍历,把单词存入到map中,最后取出符合要求的单词即可。上面是用双指针解题,其实双指针的题目很容易用滑动窗口的模板来套用解题。看题意,其实就是要把字母相同顺序不同的字符串进行分组。387. 字符串中的第一个唯一字符。3. 无重复字符的最长子串。解题思路 --- 滑动窗口。136. 只出现一次的数字。解题思路 -- 哈希表。49. 字母异位词分组。解题3 --- 位运算。819. 最常见的单词。原创 2023-06-01 20:32:35 · 560 阅读 · 0 评论 -
数据结构 --- 红黑树
红黑树也是一种自平衡的二叉搜索树,和AVL树比较,插入和删除时,旋转的次数更少。原创 2023-05-31 19:47:02 · 652 阅读 · 0 评论 -
数据结构 -- AVL树
平衡搜索二叉树,相对于搜索二叉树而言,AVL树又多了一个性质:左右子树的高度差不大于1.2、平衡因子,balance factor,以下简称bf,是左子树高度减去右子树的高度。检查节点是否失衡,如果失衡,就平衡,然后返回新的跟节点。5、平衡操作,发生在新增,删除时,对树进行平衡的操作。右旋方法:传入要旋转的节点,返回值是新的根节点。左右旋方法 --- 先左旋左子树,在右旋跟节点。插入的时候,要更新节点高度,并平衡树。右子树先右旋,失衡节点在左旋。左子树先左旋,失衡节点右旋。7、 节点的删除操作。原创 2023-05-29 20:13:08 · 696 阅读 · 0 评论 -
数据结构 --- 树
把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。循环或者递归,比较key的值,key比当前节点的key大,就往右子树找,key比当前节点的key小,就往左子树找,找不到就返回null。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。递归,但是要注意一点,如果左右子树为null的时候,就不应该计算进去。二叉搜索树满足:节点的key大于左子树的key,小于右子树的key。给树的节点定义一个key,是不可用重复的。原创 2023-05-27 21:13:20 · 818 阅读 · 0 评论 -
LeetCode刷题 --- 两个关联数组的排序技巧
刷题的过程中,经常会遇到一些题目中给了关联数组,即 int[] values1 ,int[] values2,解题过程中需要根据某个数组的值进行排序,但是要同时保证另外一个关联数组也按照同样规则排序。构建一个一维数组,存储数组的坐标,然后根据排序规则新数组,取值根据坐标取就OK了。给定的两个数组按照value值进行关联排序,后面按照题意解题即可。构造二元数组,然后排序,后续取值的时候,从二元数组中取值。如下:根据values的进行从大到小排序。如下:根据values的进行从大到小排序。原创 2023-05-24 12:02:45 · 155 阅读 · 0 评论 -
数据结构 --- 堆
题目比较难以理解,简单的说就是,给一个数组,和一个k的值,进行初始化,每次add的时候,加入一个元素,然后,把当前数据里面第K大的元素删除并返回。前面已经实现了大顶堆,其实poll方法拿出来的,就是当前最大的元素,因此排序方法可以写成下面的格式。找到堆中的最后一个非叶子节点,从当前节点往前遍历,不断的执行下沉操作。不断的往定义的列表中添加数据,取这个列表中的中位数。移除指定元素的操作,思路也是一样的,代码如下。3、堆的构造方法 --- 建立堆的操作。请注意,你需要找的是数组排序后的第。原创 2023-05-23 22:45:45 · 643 阅读 · 0 评论 -
数据结构 -- 队列
因为一把锁的时候,offer拿锁,poll会阻塞,因此在size++的过程中,就不可能出现size++的操作,故是线程安全的,而两把锁的时候,offer和poll互不影响,因此就可能在size++的时候出现size-- 导致线程不安全。poll:定义一个max指针,先指向最后面,然后不断往前遍历,如果前面的优先级大,那么就更新max的值,找到最大的max,删除该位置元素,然后后面数组向前移动。这个题是一个变形的二叉树层序遍历,可以用BFS求解,值得注意的是,每隔一层,输出的值顺序是相反的。原创 2023-05-23 14:40:14 · 576 阅读 · 0 评论 -
LeetCode刷题 --- 栈
图示,先push1,2,3,然后peek,栈1内元素转到栈2,后面只要栈2不为null,就可以执行pop和peek操作,如果为空,在吧元素从栈1转到栈2 就可以了。每次入栈的时候,判断当前元素和栈顶元素是否配对,如果配对,则弹出,如果不配对,则继续入栈。最后栈元素为空,则true,否则,为false。遇到左括号,则对应的右括号入栈,遇到右括号,则比较与栈顶元素是否一致,一致则出栈,继续,否则直接返回false。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(原创 2023-05-19 21:47:20 · 589 阅读 · 0 评论 -
LeetCode刷题 -- 一些经典的例题
ASCII:将英语中的字符表示为数字的代码。为每个字符分配一个介于 0 到 127 之间的数字。将A~Z对应位号存入相应的数据,比如记录一个字母出现了多少次 (小写字母同理)我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。常见的ASCII码大小比较:0~9原创 2022-12-20 17:15:57 · 272 阅读 · 0 评论 -
LeetCode刷题--并查集
遍历外层数组,使用并查集将每个内层数组的两个节点merge,如果遍历过程中发现两个节点的root已经相同, 说明两个节点早就在一个集合里面,删除这个连接也不会影响,因此,这个边就是题目要寻找的边。并查集是一种典型的数据结构,用于处理一些不相交集合的合并和查询问题。给出的edges是一个二维数组,其中外层数组是两两关联的点,内层数组是连接的这两个点。一个无向图,找到可以删除的边,要求删除这个边后,剩下的n个节点是一个树。两个城市相连的时候怎么办?两个城市直接相连是1,不直接相连是0,题目用二维数组进行呈现。原创 2022-10-20 20:22:08 · 390 阅读 · 0 评论 -
Leetcode刷题 -- 单调栈
顾名思义,首先是一个后入先出的栈,其次,栈内存储的数据是单调有序的。单调递增栈:单调递增栈就是从栈底到栈顶数据是从小到大单调递减栈:单调递减栈就是从栈底到栈顶数据是从大到小原创 2022-10-19 20:05:25 · 344 阅读 · 0 评论