算法
进击的中国学渣
努力也许改变不了一切,但能改变许多
展开
-
冒泡排序,插入排序,选择排序
1 冒泡排序 冒泡排序是最简单的排序算法之一,思想就是让相邻的2个数互相比较,如果不符合排序要求就交换位置,每遍历一次就会有一个数沉底,这个动作就像冒泡一样,所以叫冒泡排序。这个名字是我猜的,也没有去深究冒泡排序为什么叫冒泡排序,想知道的伙伴自己上网查一下。 接下来就是实现,实现一个算法不要背,即使是这么简单的算法,一定要理解。按照我们的理解:1冒泡排原创 2017-01-07 16:18:52 · 332 阅读 · 0 评论 -
堆排序
堆排序我个人觉得是8大排序里边最难的一个,因为它不仅仅是一个排序算法,还涉及到一种常用的数据结构,大根堆。这是一个面试最容易问到的排序,因为它涉及到的知识点非常多,下面就对堆排序做一个总结。 首先堆排序,从算法的角度出发,分为3步: 第一步:构建初始的大根堆 public static int[] buildMaxH原创 2017-01-23 22:53:20 · 190 阅读 · 0 评论 -
如何求一棵二叉树的深度
如何求一棵二叉树的深度,递归实现:public static int getLength(Node root){ if(root==null) return 0; int depth1; int depth2; else{原创 2017-09-06 17:57:08 · 1450 阅读 · 0 评论 -
余弦定理判断字符串相似度
最近碰到一个需求需要判断文本串的相似度,借助了余弦定理。此处仅提供代码,具体余弦定理的实现原理我不会。保存一下,以后可以直接用,这个算法不支持英文和数字。比如yy和yy哒进行比较,就会有问题。package com.wsy.cosine;import java.io.UnsupportedEncodingException; import java.util.HashMap; import java转载 2017-08-29 23:53:48 · 938 阅读 · 2 评论 -
动态规划之0/1背包问题-java实现
动态规划问题适合用于解决最优解问题,比如0/1背包问题. 背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包可使得背包中的总价值最大? 这个问题可以用穷举法实现,但是当数量大了之后,穷举法显然不合适。 先对这个问题进行数学建模,针对a1,a2……原创 2017-08-30 14:06:46 · 807 阅读 · 1 评论 -
最长公共子序列-java实现
之前看过一个LCS算法的实现过程,觉得太过繁琐。自己写了一个比较简单的,此处仅仅介绍实现过程。 程序代码测试通过,需要的童鞋可以在这里拷贝一下,代码如下:package com.wsy.dynamic;import java.util.HashMap; import java.util.Map;public class ImpLCS { public String getLCS(Strin原创 2017-08-30 18:49:45 · 900 阅读 · 0 评论 -
最长公共字符串
网上有不少求最小公共字符串的算法,自己实现了一个。此处仅提供代码实现:package com.wsy.dynamic;import java.util.Arrays;public class DynamicImprove { /** * 求2个字符串最长公共字符核心方法 * @param str1 * @param str2 * @param n原创 2017-08-30 22:14:34 · 271 阅读 · 0 评论 -
最少硬币问题-java实现
package com.wsy.dynamic;public class DynamicCoin { /** * 最少硬币找零问题 * * @param coinValue * :不同币值的数组 * @param coinKinds * :数组的大小 * @pa转载 2017-08-31 17:15:25 · 4571 阅读 · 2 评论 -
快速排序-java实现
快速排序是目前现有的最优时间复杂度的排序算法,核心思想是选择一个数作为序列的基准数,将比它大的数放到右边,比它小的数放到它的左边。那么在一次循环之后,这个数的左边都比它小,右边都比它大。所以这个数对于最终结果来说,它已经放在它应该在的位置。因而我们只需要通过递归的思想对基准数左右进行相同的操作即可。所以我们得到如下代码:/** * 快速排序启动器 * @param a原创 2017-08-31 23:28:25 · 216 阅读 · 0 评论 -
二叉树中2个节点的最小公共父节点
关于如何求二叉树2个节点的最小公共父节点,分2种情况讨论 情况1:节点有parent节点 这种情况就直接找到节点1和节点2的根节点,然后求得2个链表的长度,再求得长度差。如果说2条链子的长度差为n,那么 就长的节点先移动n步,然后和短的节点一起移动,并且判断父节点是否相等。那么这边其实也解决了另一个问题,就是求2个链表 的交点。 pu原创 2017-01-19 15:17:03 · 2699 阅读 · 0 评论 -
判断一棵树是否是另一棵树的子树 java实现
这是一个很经典的算法题,听起来好像挺难的,但是其实很简单。我觉得我们接触到的问题,并没有难题,只有复杂不复杂。一个再难的问题,也可以分解成一个个简单的问题,再将这些简单的问题交给不同的人去做就构成了一个项目。其实写算法也是这个思想。 首先要判断一棵树是不是另一棵树的子树,我们只需遍历一棵树,用这个树的每一个节点去和另一棵树比较。那么这个问题就被 转化成了,如何遍历一棵树和如何原创 2017-01-19 14:38:50 · 2681 阅读 · 1 评论 -
数组转二叉树 java实现
树是一种存储数据的数据结构,查询的时间复杂度相对于链表,线性表来说查询的速度要快很多。 树在实际开发的当中我们用的特别少,但是在许多涉及到查询的工具中却是很常用的。比如innodb的索引,用的就是b树。因为树的查询速度快,所以索引就是利用树来存储数据的位置。虽然实际开发的代码中用的少,但是为了以后更深入地学习,是必须要学会树这种数据结构的。 树的结构很简单,现在原创 2017-01-08 18:57:48 · 4391 阅读 · 0 评论 -
二分查找
接触编程的人,肯定都接触过二分查找算法。这是一个很简单的算法,可是真的通过语言实现的时候,却有很多人写得不好。 今天写一个二分查找的java实现,编程小白可以看看。 public static int binarySearch(int[] a,int key){//首先方法的命名,不要随便乱写,最好能够一目了然 if(a.length==原创 2017-01-08 22:12:50 · 163 阅读 · 0 评论 -
二叉树的反转
之前知道Homebrew的作者居然不会二叉树的反转,其实术业有专攻,我觉得他不会二叉树的反转其实很正常。我身边很多工作多年的程序员都忘了动态规划算法怎么回事了。 我觉得事实上这种简单的算法还是要掌握的,下面是二叉树的反转java递归实现。 public Node invertNode(Node root){ if(root==null)原创 2017-01-08 22:52:33 · 343 阅读 · 0 评论 -
树的前序,中序,后序遍历的递归以及非递归实现
之前只会树的前序,中序,后序遍历的递归实现。今天主要是总结非递归实现。 先把递归实现的前中后遍历写一遍,节点的定义就省略不写了。 //前序遍历 public static void preTraversal(Node root){ if(root!=null){ System.ou原创 2017-01-10 18:27:42 · 320 阅读 · 0 评论 -
归并排序-java实现
归并排序的思想:先将数组不断二分,直到不能分时再进行合并。 如:3, 1, 5, 6, 4, 2, 5 先分成3,1,5,6和4,2,5 再对3,1,5,6和4,2,5再进行二分,以3,1,5,6举例: 3,1,5,6被分成3,1和5,6,对3,1再进行二分,得到3和1。因为3和1都不能再进行二分,故而对3,1进行合并,得到1,3。同理5,6合并得到5,6。再对1,3和5,6进行合并得到1,原创 2017-09-01 13:33:55 · 183 阅读 · 0 评论