![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 66
pan_mlpan
没有伞的孩子要努力奔跑
展开
-
单调栈
单调栈定义:单调栈就是利用栈进行求解的一种方法。单调栈中存储的元素的顺序要么是单调递增、要么是单调递减的,利用单调栈的维护是O(n)的时间复杂度,所有元素都只会进栈一次。性质:单调栈里面的元素要么是单调递增,要么是单调递减,具备单调性;元素加入栈前会把栈中已经存在的元素可能破坏单调性的元素poll掉注意:虽然栈中的元素是具备单调性的,但是可能是值具备单调性,而存储的是下标。所以单调栈中存储的元素既可以是数组的值,也可以是数组的下标。1、去除指定位数的数字,使得数字最小答:cl原创 2021-04-24 20:26:31 · 65 阅读 · 0 评论 -
树的建立(已知前序、中序、后序构建二叉树)
树的建立前提的知识:前序 : 先访问根节点,再访问左子树,最后访问右子树中序 : 先访问左子树,先访问根节点,最后访问右子树后序 : 先访问左子树,再访问右子树,最后访问根节点关于树的遍历可以查看这篇博文:树的遍历根据树的这几种遍历结果可以构造唯一的二叉树前序与中序遍历结果构造唯一的二叉树中序与后续遍历结果构造唯一的二叉树前序与后序遍历结果构造的二叉树并不唯一1、给定前序和中序,构造二叉树主要采用递归的思想结合前序与中序的遍历规则:根节点肯定是前序的节点根节点确定后,那原创 2021-04-23 10:14:24 · 1010 阅读 · 0 评论 -
最短路径问题
最短路径一般最短路径两种处理方法,dfs与bfs以题目为例子:1、到达n点的最短路径dfs解法利用一个数组保存点的使用状态,遍历过的设置为true,没遍历的设置为false对每一个点的所有边进行遍历,依次进行以到达最后一个点作为结束,因为题目只让求到n节点(下标也就是n-1)的最短距离注意:题目有个大坑,就是说可能有重复边。所以在构造边图的时候需要进行一个比较(dp[edge[0] - 1][edge[1] - 1] = Math.min(edge[2] , dp[edge[0] -原创 2021-04-20 10:07:50 · 503 阅读 · 0 评论 -
并查集
并查集总体思想,首先,每一个结点都是一颗独立的树(树上只有其单个节点作为根节点,其父节点就是其自己),然后这些节点就形成了一个森林。例如: 有[1…6]的节点,那么其的结构图如下:然后根据给的关系,进行这些树的合并,也就是改变某些树的根节点,使其变为其他树的子树,这些有关系的节点就由以前的多颗树就形成了一颗树。例如:1与3有关联关系,那么就把3的父节点指向1,形成一颗树2与1有关联关系,那么就把2的父节点指向1,1这颗树就逐渐大了起来若各个节点都是连通的,则最终的图可能如下:若1、2、原创 2021-04-19 09:33:09 · 96 阅读 · 0 评论 -
背包问题
背包问题典型的动态规划dp[i][j]:表示当使用goods[0, …, i](当到达第i件物品时),最多可装j重量物品时,此时背包最多能装物品的价值。(j是背包的容量,从1-value)0/1背包定义:物品只能用一次dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i])dp[i-1][j]:第i件物品不选择,价值就是前一个物品的最大价值dp[i-1][j-weight[i]] + value[i]: 选择了第i件物品,那么看原创 2021-04-18 10:11:02 · 77 阅读 · 0 评论 -
拓扑排序
拓扑排序知道有节点数 n 及其节点之间的顺序关系 (x1 , x2),可以判断是否有环(1)dfs的思路利用一数组保存节点是否已经访问利用list保存关系,list.get(i)表示 i 后面的元素有哪些从某点出发,访问过的节点进行标记,然后逐步访问其后面的元素未访问的初始就是0 ,已经标记过的记作1,-1表示被别人标记过了,说明回到起点(2)bfs的思路利用一个数组degree,degree[i]表示i的入度利用list保存关系,list.get(i)表示 i 后面的元素有哪些利原创 2021-04-17 20:55:40 · 75 阅读 · 0 评论 -
二分查找(普通、找第一个、找最后一个)
二分查找二分查找在做算法题的时候经常使用到,一般会用于排序后的数组中的查找目标元素二分查找的核心思想是「减而治之」,即「不断缩小问题规模」。涉及到三种情况(1)无重复数据的已排序数组寻找目标元素(2)有重复数据的已排序数组寻找目标元素第一次出现的位置(3)有重复数据的已排序数组寻找目标元素最后一次出现的位置二分查找中的while写法使用:(1)while(left < right) : 这样写的好处是退出循环的时候 left == right,这样的话,在返回的时候不用考虑是返回l原创 2021-03-14 10:47:01 · 2219 阅读 · 0 评论 -
数组排序
1、选择排序首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。其次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法我们称之为选择排序。(依次选择最小的依次进行交换)public class SelectSort { public static int[] selectSort(int arr[]) { if (arr == null || arr.length原创 2021-01-09 15:15:11 · 348 阅读 · 0 评论