算法
文章平均质量分 90
BUG担当
一处编译,到处BUG
展开
-
动态规划之变态青蛙跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:(递归思想)贪心算法表达式:f(n) = f(n-1) + f(n-2) + f(n-3) + f(n-4) + f(n-5) + … + f(2) + f(1)代码实现:public class Main3 { //f(n) = f(n-1) + f(n-2) ...原创 2020-03-11 16:39:41 · 362 阅读 · 0 评论 -
动态规划之青蛙跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路:(递归思想) 要想到达第n阶必须先到达n-1或者n-2台阶处,计算到达n-1和n-2的跳法表达式: f(n) = f(n-1) + f(n-2)代码实现:public class Main { //要跳到上n级台阶,那么在这之前,青蛙必须跳上n-1 或者 ...原创 2020-03-11 16:36:29 · 584 阅读 · 0 评论 -
动态规划之斐波那契数列
现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。思路:(利用递归思想)表达式:f(n) = f(n-1) + f(n-2)代码实现:public class Main1 { public static void main(String[] args) { //System.out.println(fibo(10)); } //求...原创 2020-03-11 16:27:04 · 180 阅读 · 0 评论 -
图的广度优先搜索
代码实现//图节点public class MapNode { public String val; public List<MapNode> neighbor;//记录周围的点 public int index; public MapNode(String val, int index) { this.val = val; ...原创 2020-03-11 16:13:00 · 265 阅读 · 0 评论 -
图的深度优先搜索
代码实现://图节点public class MapNode { public String val; public List<MapNode> neighbor;//记录周围的点 public int index; public MapNode(String val, int index) { this.val = val;...原创 2020-03-11 16:07:08 · 167 阅读 · 0 评论 -
树的广度优先搜索
代码实现 //普通树结点 public class MapNode { public int val; public List<MapNode> neighbor;//表示当前节点的所有分支节点 public MapNode(int val) { this.val = val; neighbor = ...原创 2020-03-11 16:00:07 · 398 阅读 · 0 评论 -
树的深度优先搜索
不同于二叉树,普通的树可以有多个分支。需要将所有分支装在一个集合中,并逐一递归搜索。代码实现: //普通树结点 public class MapNode { public int val; public List<MapNode> neighbor;//表示当前节点的所有分支节点 public MapNode(int val) { ...原创 2020-03-11 15:44:26 · 484 阅读 · 0 评论 -
二叉树的左右双旋和右左双旋
上节我们有讲到用单旋构建平衡树,但是单旋存在局限情况,现在我们来探讨双旋(左右双旋|右左双旋) 。如下图,一颗较为特殊二叉排序树:利用单旋的方式构建一下:最后的结果我们会发现并没有达到平衡效果。然后我们我们使用双旋的方式来构建一下:可以看到成功构建成平衡二叉树了。双旋(左右双旋|右左双旋)代码实现:/** * 二叉树结点 */public class Tre...原创 2020-03-11 14:38:14 · 1369 阅读 · 1 评论 -
二叉树的左旋与右旋
对于在一颗结点和层数比较多的二叉树上查找一个元素时, 二叉排序树的查找效率远远高于一颗普通的树。如下为普通二叉树和二叉排序树:假设查找结点20在普通二叉树上查找: //查找结点static int ct = 0;//记录比较次数public static boolean isExistTreeNode(TreeNode root, TreeNode target){ i...原创 2020-03-11 13:03:35 · 3301 阅读 · 0 评论 -
二叉排序树的构建
什么是二叉排序树?官方的定义如下:1)对于一棵树,若左子树不空,则左子树上所有结点的值均小于它的根结点的值;2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;3)左、右子树也分别为二叉排序树;4) 没有键值相等的结点。举个例子:如下图可以发现满足上述条件,所以可以称之一颗二叉排序树。如何用代码构建一颗二叉树呢? 往下看代码实现我们来通过其特点随机生成一颗二叉排序...原创 2020-03-10 16:39:50 · 4288 阅读 · 0 评论 -
克鲁斯卡尔算法生成最小生成树
举个最小生成树的例子:在一个地区有很多个小村庄,并且每个村之间都可以修路进行连通。实际上,每条路由于地形不一样,所需的经费不同,并且不可能每两个村庄都直接互通,可以间接互通,从而降低经费。如何实现呢?这时候最小生成树的作用就体现出来了。如下图:(每个点代表一个村庄,边上的值代表修路所需经费)生成最小生成树的方法最经典的有两种:普利姆算法和克鲁斯卡尔算法 。下面我们来说说克鲁斯卡尔算法算法...原创 2020-03-10 16:01:51 · 3808 阅读 · 0 评论 -
普利姆算法生成最小生成树
举个最小生成树的例子:在一个地区有很多个小村庄,并且每个村之间都可以修路进行连通。实际上,每条路由于地形不一样,所需的经费不同,并且不可能每两个村庄都直接互通,可以间接互通,从而降低经费。如何实现呢?这时候最小生成树的作用就体现出来了。如下图:(每个点代表一个村庄,边上的值代表修路所需经费)生成最小生成树的方法最经典的有两种:普利姆算法和克鲁斯卡尔算法 。下面我们来说说普利姆算法。通过...原创 2020-03-10 15:09:41 · 1455 阅读 · 0 评论 -
二叉树的广度优先搜索
二叉树的广度优先搜索无法匹配先中后序遍历任何一种方式,实际上就是按每一层结点进行搜索。我们可以借助于集合作为每一层的中间变量进行操作。eg:构建二叉树并进行广度优先搜索: public static boolean bfs(TreeNode root, int target){ ArrayList<TreeNode> roots = new ArrayL...原创 2020-03-08 13:54:27 · 2361 阅读 · 0 评论 -
二叉树的深度优先搜索
构建二叉树并进行深度优先搜索:深度优先搜索的原理其实就是利用先序遍历的原理eg:public static boolean dfs(TreeNode root, int target){ if(root == null) return false; if(root.val == target) return true; return dfs(root.l...原创 2020-03-08 13:32:26 · 1379 阅读 · 0 评论 -
根据后序和中序遍历结果还原二叉树
我们知道通过先序和中序遍历结果可以还原一颗二叉树,那么相应的知道后序和和中序遍历结果也是可以还原一课二叉树的,往下看…在知道后序和中序遍历的原理之后,我们也可以反推出一颗树。思路:1)后序遍历的最后一位即是二叉树的根节点。2)然后再中序遍历找到根结点,根节点左边的所有序列便是左子树的中序遍历结果,右边的所有序列便是右子树中序遍历结果。3)在后序遍历中找到对应的左子树,右子树。4)在...原创 2020-03-08 13:15:01 · 5726 阅读 · 0 评论 -
根据先序和中序遍历结果还原二叉树
在java中如何存储一颗二叉树树呢,显然不能直接画上去对吧(滑稽) ,一般情况我们可以将先,中序的遍历结果风别用两个数组存储,在使用的时候将二叉树还原出来。但是如何还原出来呢?往下看…在知道先序和中序遍历的原理之后,我们便可以反推出一颗树。思路:1)先序遍历的第一位即是二叉树的根节点。2)然后再中序遍历找到根结点,根节点左边的所有序列便是左子树的中序遍历结果,右边的所有序列便是右子树中...原创 2020-03-08 12:19:19 · 2111 阅读 · 0 评论 -
二叉树的遍历(先,中,后)
一,构建二叉树封装二叉树结点/*** 二叉树结点*/public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int val, TreeNode left, TreeNode right) { this...原创 2020-03-08 11:07:43 · 152 阅读 · 0 评论 -
邻接链表的遍历
我们都知道邻接链表内部结构其实就是数组+链表构成的。大致如下图:在知道数组的遍历和链表的遍历之后,邻接链表的遍历自然也会了。构建邻接链表结构并遍历/** * 链表所需节点 */public class Node { public int val; public Node next; public Node(int val){...原创 2020-03-08 10:51:36 · 387 阅读 · 0 评论 -
Java如何实现整型大数加法?看这里
引言:在java中有时候数太大了,而一般的int , long 无法存储其值。更加无法进行运算。但是我们可以用字符串方式进行操作。上代码!!public static String add(String a, String b){ int ai = 1;//数a的倒数第i位 int bi = 1;//数b的倒数第i位 int flag =...原创 2020-03-07 16:40:50 · 321 阅读 · 0 评论 -
利用双栈实现队列结构
一,封装一个栈的简单结构栈的最重要的特点相信大家都懂叭 ,如何不太清楚的话可以参考一下: 戳它!.话不多说,上代码!!!/** * 用数组封装的队列结构 */ public class MyStack { int[] data; int top = 0; public MyStack(int size){ this.data...原创 2020-03-06 14:27:46 · 242 阅读 · 0 评论