数据结构与算法
文章平均质量分 89
ForwardSummer
这个作者很懒,什么都没留下…
展开
-
0-1BFS 双端队列 广度优先搜索
那么在本文中,主要来介绍0-1BFS,或者说双端队列BFS。对于简单的BFS类题目,我们在队列尾部进行一直添加即可,但有些题目则不能满足需求,需要在头尾进行添加或者删除元素,我们称作0-1BFS或者双端队列BFS,而对于头尾的操作,可能是不同的,比如头不增加深度,而尾增加深度。原创 2023-06-30 15:53:45 · 584 阅读 · 0 评论 -
BFS (Java) 广度优先搜索 简单介绍、模板、案例(一)
深度优先搜索DFS和广度优先搜索BFS是经常使用的搜索算法,在各类题目中都有广泛的应用。深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。广度优先搜索算法(Breadth-First Search,缩写为 BFS),又称为宽度优先搜索,是一种图形搜索算法。简单的说,BFS 是从根结点开始,沿着树的宽度遍历树的结点。如果所有结点均被原创 2023-06-29 19:01:15 · 3434 阅读 · 0 评论 -
图论 (Java) 从入门到入土 /第一部分 图的基础-图的表示/
图,是一种比较复杂的数据结构。和树的一个节点只和上层一个节点相连不同,在图中,任意两个节点都可能相连,且可能具有方向性,并且节点的边具有权重,因此,图被用于描述各种复杂的数据对象,在自然科学、社会科学和人文科学等诸多领域有着非常广泛的应用。图论中一些经典的需要解决的问题有:图的遍历、图的连通性、图的判圈(环路检测)、最短路径、拓扑排序、最小生成树、网络流、二部图等。图论中一些经典的需要掌握的算法有:DFS、BFS、并查集、Dijkstra、Floyd、Prim、Kruskal等,需要了解并掌握。原创 2023-06-09 16:26:34 · 1316 阅读 · 1 评论 -
Java-数据结构-并查集<二>
并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集跟树有些类似,只不过她跟树是相反的。在树这个数据结构里面,每个节点会记录它的子节点。在并查集里,每个节点会记录它的父节点【1】。 并查集的精髓在于,两块集合(区域)有没有相交,以及要不要联通两块区域(集合)。参考树的结构,把元素挂到父节点下,若两个元素的父节点相同,则是同一块区域,两个元素的父节点不相同,则不是同一块区域。原创 2023-04-30 20:41:27 · 768 阅读 · 0 评论 -
跳跃游戏类题目 总结篇
跳跃游戏是一种典型的算法题目,经常是给定一数组arr,从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步,或者固定步数,直到到达某一位置,可能是数组的最后一个位置,也有可能是某一特别的数值处,也有可能在这个过程中,可能需要求解可能存在的最大值或者最小值。原创 2023-04-30 14:55:17 · 1066 阅读 · 0 评论 -
跳跃游戏 (DFS->记忆化搜索->动态规划/贪心证明)
跳跃游戏是一种典型的算法题目,经常是给定一数组arr,从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步,或者固定步数,直到到达某一位置,可能是数组的最后一个位置,也有可能是某一特别的数值处,也有可能在这个过程中,可能需要求解可能存在的最大值或者最小值。对于跳跃游戏类的题目,经常使用贪心、动态规划、dfs、bfs等方法解决,对于可以使用贪心解决的题目,经常也可以使用动态规划,但一般贪心可以有更好的时间复杂度和空间复杂度。还有经常使用的动态规剪枝、前缀和、滑动窗原创 2023-04-30 13:55:32 · 1825 阅读 · 0 评论 -
图论 (Java) 从入门到入土 /第一部分 图的基础-图的定义/
图,是一种比较复杂的数据结构。和树的一个节点只和上层一个节点相连不同,在图中,任意两个节点都可能相连,且可能具有方向性,并且节点的边具有权重,因此,图被用于描述各种复杂的数据对象,在自然科学、社会科学和人文科学等诸多领域有着非常广泛的应用。图论中一些经典的需要解决的问题有:图的遍历、图的连通性、图的判圈(环路检测)、最短路径、拓扑排序、最小生成树、网络流、二部图等。图论中一些经典的需要掌握的算法有:DFS、BFS、并查集、Dijkstra、Floyd、Prim、Kruskal等,需要了解并掌握。原创 2023-04-28 22:48:30 · 885 阅读 · 0 评论 -
区间DPⅡ (Java) 解析/模板/案例
区间DP,是经常会用到的、解决区间问题的一种方法,经常以动态规划(dfs/记忆化搜索)的形式展现,最核心的思想就是枚举区间(枚举端点),寻找切割点,处理因切割点而产生的结果,进行区间累加或者选取个别区间,从而解决整体的问题。原创 2023-04-28 15:35:33 · 598 阅读 · 1 评论 -
区间DP (Java) 解析/模板/案例
区间DP,是经常会用到的、解决区间问题的一种方法,经常以动态规划(dfs/记忆化搜索)的形式展现,最核心的思想就是枚举区间(枚举端点),寻找切割点,处理因切割点而产生的结果,进行区间累加或者选取个别区间,从而解决整体的问题。原创 2023-04-26 09:11:33 · 1034 阅读 · 1 评论 -
统计字典序元音字符串的数目 (回溯/dfs/动态规划/压缩/数学)
(1)题目的套壳为元音字符,实质即为严格递增序列,那么同样的,{1,2,3,4,5}是和本题目具有相同本质的序列,返回的所有可能数量也是相同的(2)题目要求选出所有可能的字符串数量,本质是给定输入有规律数据,返回整数,大部分的此类型题目都可进行找规律,或者更进一步总结出数学规律,或者本身是在经典数学问题上编制的题目(3)本题目只返回所有的可能性,如果答案是返回所有的可能性的集合,那么只有回溯方法适合(4)因为返回是可能性,那么在题目的解答上,具有多种方法可以解答,且都是经常用到的解法,比较适合当当作模板题原创 2023-04-02 21:36:42 · 755 阅读 · 0 评论 -
数位DP 详解及其案例实战 [模板+技巧+案例]
DP的本质:DFS+记忆化搜索(可选项)+约束(可选项)数位DP简单介绍 数位DP的本质数位DP在实际使用面临什么难点数位DP典型模板和技巧leetcode233数字 1 的个数leetcode 2376 统计特殊整数leetcode1012 至少有 1 位重复的数字原创 2023-03-24 20:16:01 · 1752 阅读 · 3 评论 -
Java 前缀和 及其优化技巧Ⅱ
对于数组nums来说,前缀和pre[i] =pre[i-1] + nums[i],即每个位置上存储的是前i个数组元素的和,其他类型的前缀和多是最终能变成和数量相关,即转换成int[] 数组类型。那么,对于后缀和是一样的道理。在一些题目或者场景中,出现了子数组*,连续一段区间,并且和求数量或者判断数量相关,很大程度上可以向前缀和的方去思考。原创 2023-03-20 14:34:07 · 641 阅读 · 2 评论 -
前缀和 及其优化技巧
在一些题目或者场景中,出现了子数组*,连续一段区间,并且和求数量或者判断数量相关,很大程度上可以向前缀和的方去思考。在实际的题目中,单独使用前缀和可以解决问题,但有些题目受限于时间和空间复杂度,单独依靠前缀和往往不能AC,需要一些额外的技巧或者附加数据结构,例如动态规划和HashMap。原创 2023-03-13 20:42:33 · 1100 阅读 · 5 评论 -
跳跃游戏 (动态规划剪枝/前缀和/滑动窗口/BFS剪枝)
跳跃游戏是一种典型的算法题目,经常是给定一数组arr,从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步,或者固定步数,直到到达某一位置,可能是数组的最后一个位置,也有可能是某一特别的数值处。青蛙跳台爬楼梯最小成本leetcode1696跳跃游戏 VIleetcode1413逐步求和得到正数的最小值leetcode55 跳跃游戏leetcode45跳跃游戏 IIleetcode1306 跳跃游戏 III原创 2023-03-13 09:53:42 · 820 阅读 · 5 评论 -
跳跃游戏 (贪心/动态规划/dfs)
跳跃游戏是一种典型的算法题目,经常是给定一数组arr[],从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步,或者固定步数,直到到达某一位置,可能是数组的最后一个位置,也有可能是某一特别的数值处。leetcode1306 跳跃游戏 IIIleetcode45跳跃游戏 IIleetcode55 跳跃游戏原创 2023-02-27 22:18:34 · 1387 阅读 · 0 评论 -
堆,堆构建,堆排序,PriorityQueue和TopN问题
堆,堆构建,堆排序,PriorityQueue和TopN问题堆作为一种重要的数据结构,在面笔试中经常出现,排序问题中,堆排序作为一种重要的排序算法经常被问道,大顶堆小顶堆的应用经常出现,经典的问题TopN问题也是堆的重要应用,因此,了解并掌握这种数据结构是很必要的。 堆的数据结构可以看作是一种抽象的搜索二叉树,通过大顶堆或者小顶堆,来达到快速找到一新数据在整个堆结构中的应有位置,继而来实现排序、TopN问题或者log级别的算法要求。原创 2023-02-21 20:27:53 · 572 阅读 · 0 评论 -
Java-Deque和Queue的使用、辨析和实战案例
在数据结构与算法中,队列是被经常使用的一种数据结构。作为一种经典的数据结构,栈承担了先进后出的责任,而在先进先出这方面,则由队列来完成。队列有单向队列,即最经典的队列,一头进,另一头出,而双端队列,两端都可以进出,比较灵活,所以造成了双端队列的api较多,在实际使用中经常会搞错方向。在Java中,Queue是队列的接口,主要的方法有6个,比较简单。常用的实现类有两个:LinkedList()和ArrayDeque()。原创 2023-02-13 14:09:00 · 1658 阅读 · 0 评论 -
Java-数据结构-二叉树<三>
leetcode 剑指 Offer 54. 二叉搜索树的第k大节点leetcode236二叉树的最近公共祖先leetcode653 两数之和 IV - 输入二叉搜索树leetcode102 二叉树的层序遍历leetcode105从前序与中序遍历序列构造二叉树leetcode654 最大二叉树leetcode96 不同的二叉搜索树leetcode95不同的二叉搜索树IIleetcode515在每个树行中找最大值leetcode剑指 Offer 33. 二叉搜索树的后序遍历序列原创 2023-01-23 22:35:52 · 1048 阅读 · 0 评论 -
数据结构-单调队列
与单调栈相似,单调队列里存的也是具有单调性质的数据。单调队列与普通队列不一样的地方就在于单调队列既可以从队首出队,也可以从队尾出队。即是两个方向都可以进出的“单调栈”。原创 2023-01-11 11:23:55 · 745 阅读 · 0 评论 -
只出现一次(N次)的数字 / 出现次数最多的数字 / 数组中数字出现的次数
数组中数字出现的次数是一类经典的问题,通常让我们求数组中数字出现的次数及其衍生的问题,比如,只出现一次的数字,只出现两次的数字,在一个数组中只有一个数字出现一次,其他出现两次或者三次,数组中出现次数最多,数组中出现的次数超过半数等。原创 2023-05-03 21:48:27 · 682 阅读 · 0 评论 -
原地算法(数组向)
原地算法 生命游戏 leetcode73 矩阵置零 leetcode223 生命游戏。 在上述案例中,如果使用深拷贝,问题将很容易解决,但一是耗费空间较大,二是如果在面试中,这种类型的题目肯定是想让你使用原地算法。 原地算法,即不占用额外空间(少量占用),在不改变原本数据附带的信息的条件下,为数据附上新的信息。要注意,不是不改变原本的值,是不改变原本的值所附带的信息。原创 2022-11-14 16:07:01 · 2111 阅读 · 0 评论 -
子串和子序列问题-动态规划向
有关于子序列和子串的问题是字符串或者数组经常会遇到的问题,一般我们经常使用多指针,滑动窗口,动态规划的方式去解决,而本篇重点关注能用动态规划解决或者说明显使用动态规划解决的子串问题和子序列问题。子串是字符串中的由连续字符组成的一个序列,重点在于连续。例如,"1AB2345CD",那么"1AB23","5CD"都是相应的子串,而"12345CD"不是,已经不是连续的状态。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串,那么很明显,子序列和子串最大的区别就是可原创 2022-10-23 16:42:20 · 1988 阅读 · 0 评论 -
动态规划 买卖股票/打家劫舍/零钱兑换 专题
买股票问题,小偷问题和零钱兑换是动态规划中经常遇到的问题,也是面试笔试经常爱考的问题,掌握这些基础的方法和思路是很有必要的。 买卖股票的问题的关注点在于今天的股票状态以及构成今天股票的状态从何而来。 打家劫舍的问题的关注点在于当前家要不要偷 零钱兑换的问题的关注点在于当前硬币要不要(转换为背包问题)原创 2022-10-07 14:33:18 · 316 阅读 · 0 评论 -
LRU LFU 概念、底层原理及其实现 超详细~
计算机的运行的程序和数据保存在内存中,内存的空间是有限的,所运行的程序可能需要新的数据,而数据不在内存,在磁盘(硬盘)中。CPU 访问的页面在物理内存时,便会产生一个缺页中断,请求操作系统将所缺页调⼊到物理内存。对于要新加入内存的页面,需要一定的算法来确定把哪个页面剔除出去给新的要加进来的页面让位。所以,页面置换算法的功能是,当出现缺页异常,需调入新页面而内存已满时,选择被置换的物理页面,也就是说选择⼀个物理页面换出到磁盘,然后把需要访问的页面换入到物理页。那其算法目标则是,尽可原创 2022-10-05 12:05:55 · 5969 阅读 · 2 评论