leetcode
文章平均质量分 88
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 评论 -
Java-Deque和Queue的使用、辨析和实战案例
在数据结构与算法中,队列是被经常使用的一种数据结构。作为一种经典的数据结构,栈承担了先进后出的责任,而在先进先出这方面,则由队列来完成。队列有单向队列,即最经典的队列,一头进,另一头出,而双端队列,两端都可以进出,比较灵活,所以造成了双端队列的api较多,在实际使用中经常会搞错方向。在Java中,Queue是队列的接口,主要的方法有6个,比较简单。常用的实现类有两个:LinkedList()和ArrayDeque()。原创 2023-02-13 14:09:00 · 1658 阅读 · 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 评论 -
栈和队列相互实现 (用队列实现栈/用栈实现队列) 超详细~
栈,一种数据结构,只能从一端进出,先进后出,操作方式主要有出栈和入栈。在Java中,一般使用Stack(已不推荐)和Deque(双端队列)实现。队列,一种数据结构,先进先出,主要类型有三种,单向队列,双端队列,循环队列。原创 2022-10-03 11:53:47 · 753 阅读 · 0 评论 -
算法-动态规划-背包问题-附一
给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。 在最原始的背包问题中,我们假设每种物品只可以选一次,那么背包问题就可以转换为更为具体的0/1背包问题,即每种物品要与不要的问题。这种问题用暴力解法可以用回溯来做,即每种物品开始直接选择,然后递归,然后撤回对该物品的选择。假设我们的物品的重量为w[i],物品的价值为v[i],动态规划产生的dp表为dp[i][j],其中i代表第i件物品,j代表此时背包的容量,那么我们需要求得的结果即为dp[i][j]代表此时原创 2022-08-31 15:57:24 · 602 阅读 · 0 评论 -
堆,堆构建,堆排序,PriorityQueue和TopN问题
堆,堆构建,堆排序,PriorityQueue和TopN问题堆作为一种重要的数据结构,在面笔试中经常出现,排序问题中,堆排序作为一种重要的排序算法经常被问道,大顶堆小顶堆的应用经常出现,经典的问题TopN问题也是堆的重要应用,因此,了解并掌握这种数据结构是很必要的。 堆的数据结构可以看作是一种抽象的搜索二叉树,通过大顶堆或者小顶堆,来达到快速找到一新数据在整个堆结构中的应有位置,继而来实现排序、TopN问题或者log级别的算法要求。原创 2023-02-21 20:27:53 · 572 阅读 · 0 评论 -
数据结构-单调队列
与单调栈相似,单调队列里存的也是具有单调性质的数据。单调队列与普通队列不一样的地方就在于单调队列既可以从队首出队,也可以从队尾出队。即是两个方向都可以进出的“单调栈”。原创 2023-01-11 11:23:55 · 745 阅读 · 0 评论 -
Java-数据结构-矩阵专题
矩阵其实就是一个二维的表格,那么数据结构中的矩阵其实也是一样的,计算机中可以用矩阵这种形式来存储数据。使用二维数组可来存储矩阵。原创 2022-08-05 09:55:02 · 3796 阅读 · 0 评论 -
Java-数据结构-字符串专题<二>
字符串是复合数据类型。在程序中经常会用到字符串及对字符串的各种操作,如字符串的连接、比较、截取、查找和替换等。Java提供了Java.lang.String类来对字符串进行这一系列的操作,以及StringBuffer,StringBuilder类.............原创 2022-07-31 15:34:10 · 308 阅读 · 0 评论 -
Java-数据结构-字符串专题<一>
字符串是复合数据类型。在程序中经常会用到字符串及对字符串的各种操作,如字符串的连接、比较、截取、查找和替换等。Java提供了Java.lang.String类来对字符串进行这一系列的操作,以及StringBuffer,StringBuilder类.......原创 2022-07-27 23:25:53 · 537 阅读 · 0 评论 -
Java-算法-回溯<三>
回溯算法是基于递归函数之上的,本质是穷举所有可能符合答案的选项。和一般递归最大的区别是,本身带有撤销这一明显特征,即选择,递归,然后返回,撤销。虽然可以加一些剪枝的操作,但本身算法时间复杂度很高,没有改变穷举的本质。回溯算法主要解决排列,组合,子集类的问题。.........原创 2022-08-29 17:16:02 · 177 阅读 · 0 评论 -
Java-数据结构-滑动窗口
滑动窗口是双指针技巧的一种,常用于解决子串、子序列问题。滑动窗口的思想是维护一个窗口,不断滑动更新。滑动窗口的难点是各种细节:如何向窗口中添加元素、如何缩小窗口、何时更新结果。滑动窗口有一套通用的框架,解决滑动窗口题目大家都可以尝试套用该框架。框架的整体思路是移动窗口右边界,向窗口中添加元素,窗口满足要求解的问题(如窗口等于目标子串),开始滑动左边界找到满足条件的最小值。......原创 2022-07-24 22:40:38 · 4420 阅读 · 2 评论 -
Java-数据结构-数组
数组是在程序设计中,把具有相同类型的若干元素按有序的形式组织起来的一种形式。数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素。 数组作为线性表的实现方式之一,数组中的元素在内存中是连续存储的,且每个元素占相同大小的内存。...............原创 2022-08-05 09:49:37 · 762 阅读 · 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 评论 -
Java-数据结构-二叉树<二>
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分 。 其中,满二叉树和完全二叉树是其中比较特殊的类型。如果一棵二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层上,则这棵二叉树为满二叉树。深度为k,有n个节点的二叉树当且仅当其每一个节点都与深度为k的满二叉树中编号从1到原创 2022-07-16 23:32:58 · 150 阅读 · 0 评论 -
数据结构-链表 (Java) <三>
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思),通常链表的头被称为head,尾部一般用null表示。链表的类型有单链表,双链表,循环链表等。数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。链表是通过指针域的指针链接在内存中各个节点。......原创 2022-08-05 10:52:09 · 197 阅读 · 1 评论 -
Java-数据结构-链表<二>
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)[1],通常链表的头被称为head,尾部一般用null表示。 链表的类型有单链表,双链表,循环链表等。数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。链表是通过指针域的指针链接在内存中各个节点。...原创 2022-07-05 22:53:11 · 271 阅读 · 0 评论 -
Java-数据结构-二叉树<一>
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分 。 其中,满二叉树和完全二叉树是其中比较特殊的类型。如果一棵二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层上,则这棵二叉树为满二叉树。深度为k,有n个节点的二叉树当且仅当其每一个节点都与深度为k的满二叉树中编号从1到.....原创 2022-07-12 10:20:19 · 377 阅读 · 0 评论 -
Java-数据结构-链表<一>
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)[1],通常链表的头被称为head,尾部一般用null表示。...............原创 2022-07-01 16:45:29 · 944 阅读 · 0 评论 -
Java-算法-排序算法
(1)冒泡排序;(2)选择排序;(3)插入排序;(4)希尔排序;(5)归并排序;(6)快速排序;(7)基数排序;(8)堆排序;(9)计数排序;(10)桶排序。原创 2022-06-19 14:41:50 · 132 阅读 · 0 评论 -
Java-数据结构-单调栈<二>
一般使用单调栈无非两个方向,单调递减,单调递增。单调递增栈:存进去的数据都是增加的,碰到减少的时候,这时就要进行操作了单调递减栈:存进去的数据都是减少的,碰到增加的时候,这时就要进行操作了对于「找最近一个比当前值大/小」的问题,都可以用单调栈来试试。关键在于,对于栈内存储的元素,什么时候进行取出来操作,是个关键的问题。.....................原创 2022-06-16 14:42:36 · 377 阅读 · 0 评论 -
Java-算法-回溯<二>
回溯算法是基于递归函数之上的,本质是穷举所有可能符合答案的选项。和一般递归最大的区别是,本身带有撤销这一明显特征,即选择,递归,然后返回,撤销。虽然可以加一些剪枝的操作,但本身算法时间复杂度很高,没有改变穷举的本质。 回溯算法主要解决排列,组合,子集类的问题 [1]。.........原创 2022-06-04 16:13:31 · 475 阅读 · 0 评论