
轻松学算法
文章平均质量分 64
三名狂客
success without applause,diligence without reward!Becoming、Cognifying、Flowing、Screening、Accessing、Sharing、Filtering、Remixing、Interacting、Tracking、Questioning、Beginning.
展开
-
寻找最长回文子串
一、题目给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。示例 1:输入: “babad”输出: “bab”注意: "aba"也是一个有效答案。二、解决方案package com.company;/** * 功能描述: 最长回文子串 * * @author zc * @since 2020-05-19 */class Solution05 { /** * 寻找最长回文子串 * 算法: 动态规划 * 动态原创 2020-05-21 18:03:45 · 509 阅读 · 0 评论 -
快排小结
一、快排序简介快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,快速排序的核心思想----分治法。快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。二、代码实现(1)复原创 2020-05-18 11:19:32 · 531 阅读 · 0 评论 -
堆排序
一、堆排序简介堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种**选择排序,**它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。堆排序的基本思想是:将待排序序列构造成一个大顶堆 ( 一般升序采用大顶堆,降序采用小顶堆 ),此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。二、堆排序实现/** * * 堆排序原创 2020-05-13 15:11:11 · 499 阅读 · 0 评论 -
最短路径(邻接表)-Dijkstra算法
最短路径(邻接表)-Dijkstra算法:生成的图采用邻接表的存储方式。 具体的实现代码如下:package com.threeTop.www;import java.util.Hashtable;import java.util.Stack;/** * 邻接表存储方式的Dijkstra算法 * @author wjgs * */public class原创 2017-04-26 17:04:40 · 9152 阅读 · 2 评论 -
最短路径(邻接矩阵)-Dijkstra算法
Dijkstra算法又叫作迪杰斯特拉算法,是利用"贪心法"(在对问题进行求解时,总是做出在当前看来最好的选择策略)设计算法的一个成功范例。 适用条件:带权无环和无负权值 举个栗子:原创 2017-04-26 16:16:07 · 12664 阅读 · 2 评论 -
排序算法性能对比
相关排序算法性能对比:原创 2017-04-16 11:45:30 · 390 阅读 · 0 评论 -
图的邻接表存储下的广度优先遍历
图的邻接表存储下的广度优先遍历:需要借助队列实现. 图的邻接表存储下的广度优先遍历实现代码如下:/** * 邻接表广度优先遍历 * */ public void breadFirstTravel() { System.out.println("邻接表广度优先遍历为:"); //初始化队列 Queue queue=new LinkedList(); /原创 2017-04-25 17:59:26 · 3357 阅读 · 0 评论 -
图的邻接矩阵存储下的广度优先遍历
图的邻接矩阵存储下的广度优先遍历:就像树的按层次遍历,需要借助队列实现。 图的邻接矩阵存储下的广度优先遍历的实现代码如下:/*** * * 邻接矩阵广度优先遍历 * */ public void breadthFirstTravel() { System.out.println("邻接矩阵的广度优先遍历:"); //初始化队列,LinkedList实现原创 2017-04-25 16:44:08 · 3345 阅读 · 0 评论 -
图的邻接表存储下的深度优先遍历
在图的邻接表的存储下进行的深度优先遍历:需要用到哈希表来辅助。 具体的实现代码如下:package com.threeTop.www;/** * 邻接表节点的定义 * @author wjgs * */public class ListGraphNode { //增加索引 int index; //值 int value; //指向下一个节点的指针(原创 2017-04-25 15:35:48 · 2342 阅读 · 0 评论 -
图的邻接矩阵存储下的深度优先遍历
深度优先遍历(DFS): 借助栈进行遍历,深度优先遍历的序列不是唯一的,邻接矩阵存储的时间复杂度为O(n*n),邻接表的存储的时间复杂度为O(n+e). 邻接矩阵的深度优先遍历的实现代码如下:package com.threeTop.www;import java.util.Stack;public class MatrixGraph { //通过下标映射元素值 p原创 2017-04-25 14:34:24 · 6232 阅读 · 1 评论 -
图的邻接表存储
邻接表表示法和散列表类似,也是用一个数组,每个数组元素有个链表。其适用条件(边数不多):图的边数 图邻接表存储的实现代码如下:package com.threeTop.www;/** * 邻接表节点的定义 * @author wjgs * */public class ListGraphNode { //值 int value; //指向下一个节点的指针原创 2017-04-24 20:58:55 · 1135 阅读 · 0 评论 -
图的邻接矩阵存储
一般的图会使用二元组的方式来描述,G=(V,E) ,其中V 叫作顶点集,E叫作边集。 图分为: (1)无向图 (2)有向图 图的表示和存储方式: (1)邻接矩阵表示法 (2)邻接表表示法 邻接矩阵:存储为二维数组原创 2017-04-24 20:00:08 · 852 阅读 · 0 评论 -
思维拓展
(1)不使用额外的空间交换两个数 a. 方法一. A=A+B B=A-B;(A+B-B=A) A=A-B;(A+B-A=B) b.方法二. A=A^B B=B^A原创 2017-05-06 09:33:22 · 685 阅读 · 0 评论 -
找出数组中第k大的数
给定一个数组,找出数组中第k大的数。其实现代码如下:package com.threeTop.www;/** * 找出数组中第k大的数 * @author wjgs * */public class FindK { public static void find(int[]array,int begin,int end,int k) { int i=partition原创 2017-05-05 21:40:42 · 2121 阅读 · 0 评论 -
寻找缺少的数字
有100个连续的数字(假设1-100),随机打乱顺序,随机取出这个数字,求最快在这个数组中快速找出缺少的数字。 (1)排序后挨个查找 (2)运用hash表存储每个值,再查找 (3)巧妙的计算办法,其实现代码如下:package com.threeTop.www;import java.util.Random;/** * 寻找缺失的原创 2017-05-05 21:09:22 · 1530 阅读 · 0 评论 -
求数组中出现次数超过一半的数字
在一个数组中,某个数字出现的次数超过了数组元素总长度的一半,找出这个数字。package com.threeTop.www;/** * 找出数组中超过一半的元素 * @author wjgs * */public class MoreThanHalf { /** * O(n)时间复杂度解法 * @param array */ public static voi原创 2017-05-05 12:04:27 · 669 阅读 · 0 评论 -
动态规划
什么叫做动态规划动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。动态规划的思想动态规划背后的思想很简单,和分治思想类似,将求解的问题分解成若干个子问题,按照顺序求解子问题,列出各种可能的局部解,通过决策(根据题意)保留那些有可能达到最优的局部解,丢弃其它局翻译 2017-05-17 17:11:30 · 690 阅读 · 0 评论 -
最短路径-Floyd算法
在最短路径的求解过程,无非中有两种可能: (1)一种是能够直接到达,是最短路径; (2)另一种是需要一些顶点才能到达,也是最短路径。 Floyd算法的伪代码如下: Floyd算法的具体实现代码如下: 最短路径算法总结:原创 2017-04-27 14:24:17 · 917 阅读 · 0 评论 -
常见面试的查找和排序算法
一、排序总结其他查找算法:深度优先查找、广度优先查找、二叉树查找(先、中、后、层序遍历)等。(1) 快排 private void quicksort(int[] array, int begin, int end) { // TODO Auto-generated method stub if(begin<end) { int key=array[begin]; ...原创 2019-03-07 14:56:25 · 1199 阅读 · 0 评论 -
二叉树的先序、中序、后序递归和非递归遍历
二、二叉树遍历总结import java.util.Stack;/** * 二叉树的遍历 * @author superman * */public class Code_01_PreInPosTraversal { public static class Node { public int value; public Node lef...翻译 2018-08-23 16:26:49 · 292 阅读 · 0 评论 -
经典的KMP算法
//KMP算法(手写大名鼎鼎的kmp)经典的KMP算法时间复杂度为O(m+n)public class kmp{ //kmp算法查找是否匹配 public static int getIndexOf(String s,String m) { if(s==null||m==null||m.length()<1||s.length()&l...翻译 2018-03-26 15:27:44 · 510 阅读 · 0 评论 -
常用的算法
A*搜寻算法 俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。该算法像Dijkstra算法一样,可以找到一条最短路径;也像BFS一样,进行启发式的搜索。 Beam Search 束搜索(beam search) 方法是解决优化问题的一种启发式方法,它是在分枝定界方法基础上发展起来的,它使用启发式方法...转载 2018-04-19 17:15:04 · 332 阅读 · 0 评论 -
八大基础排序总结
一、总结 冒泡排序就这么简单 选择排序就这么简单 插入排序就这么简单 快速排序就这么简单 归并排序就这么简单 堆排序就这么简单 希尔排序就这么简单 基数排序就这么简单 二、对比转载出处 参照 参照2...转载 2018-04-09 10:11:57 · 289 阅读 · 0 评论 -
堆排序
堆排序算法一、堆排序算法的基本特性时间复杂度:O(n*lgn)最坏:O(n*lgn)空间复杂度:O(1)不稳定。堆排序是一种选择排序算法,与关键字的初始排列次序无关,即就是在最好,最坏,一般的情况下排序时间复杂度不变。对包含n个数的输入数组,平均时间为O(nlgn),最坏情况(已经排好序)也是是O(nlgn),最好情况(完全无序)也是O(nlgn)。由于不但时间复杂度少,而且空间复杂度也是最少的,...翻译 2018-03-16 11:09:52 · 287 阅读 · 0 评论 -
10大基础实用算法
算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序使用分治法(Divide and conquer)策略来把一个串行(...转载 2018-03-01 15:40:21 · 292 阅读 · 0 评论 -
十大经典算法
第十名:Huffman coding(霍夫曼编码) 霍夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法。1952年,David A. Huffman在麻省理工攻读博士时所发明的,并发表于《一种构建极小多余编码的方法》(A Method for the Construction of Minimum-Redundancy Codes)一文。第...转载 2018-03-01 15:35:13 · 8852 阅读 · 0 评论 -
八大排序算法
常见的八大排序算法,他们之间关系如下:他们的性能比较:下面,利用Python分别将他们进行实现。 插入排序直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。因此,从上面的描述中我们可以发现,直接插入排序可以用两个循环完成:第一层循环:遍历转载 2018-02-03 20:36:56 · 434 阅读 · 0 评论 -
背包问题详解
转载链接 http://web.jobbole.com/93722/01背包问题篇幅可能有点长,但请耐心看一下,你会觉得物有所值的。本文以后还会扩展,因为我还没有想到完全背包与多重背包打印物品编号的方法。如果有高人知道,劳烦在评论区指教一下。注意,由于社区不支持LaTex数学公式,你们看到${xxxx}$,就自己将它们过滤吧。1.1 问题描述:有${n}$件转载 2018-01-23 22:59:16 · 680 阅读 · 1 评论 -
栈和队列
栈是限定仅在表尾进行插入和删除操作的线性表。 队列是只允许在一端(队尾)进行插入操作,而在另一端(对头)进行删除操作的线性表。 (1)顺序栈 #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h"#defi原创 2017-06-15 15:21:44 · 426 阅读 · 0 评论 -
线性表
线性表(List):零个或多个数据元素的有限序列。 线性表的抽象定义: 线性表的顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素。线性表的链式存储结构:用一组任意的存储单元存储线性表的元素(存储数据和索引) (1)单链表 (2)静态链表:用数组描述的链表原创 2017-06-14 18:37:55 · 600 阅读 · 0 评论 -
字符串
(1)字符与字符串 字符:一般被认为是字母、数字、符号和字。字母就是A、B、C、a、b、c等,而数字 1,2,3等,字可能是中文和英文字等。 字符串是有字符组成的。一般编程语言中用String类型来表示。在java 中String的实现通过char数组实现的。 (2)字符串的全排列: 比如给定一个字符串是xyz,则其全排列是xyz, xzy, yxz,yzx,zxy,zyx原创 2017-04-27 16:37:09 · 549 阅读 · 0 评论 -
荷兰国旗问题
有一个数组,长度为n,里面只有0、1、2(分别代表红、白、蓝色),现在要求通过两两交换的方式,使得0在最前面,1在中间,2在最后面。 代码实现如下:package com.threeTop.www;/** * 荷兰国旗问题 * @author wjgs * */public class DutchFlag { /** * 荷兰国旗问题 * @原创 2017-05-04 17:04:09 · 563 阅读 · 0 评论 -
数组正负值排序
给定一个整型数组,把所有负值调到数组的左边,把所有正值调到右边。例如:1、-2、-4、5、9、-3、-8、6,调整后可以是-2、-4、-3、-8、1、5、9、6. 具体的实现代码如下:package com.threeTop.www;/*** * 数组正负值排序 * @author wjgs * */public class ArraySort { /**原创 2017-05-04 15:00:57 · 4608 阅读 · 1 评论 -
红黑树
红黑树:本质是一棵二叉查找树,其插入、删除、查找操作的时间复杂度为O(logn). 红黑树的特征: (1)每个节点都有颜色,要么是红色,要么是黑色; (2)根节点是黑色的 (3)所有的叶节点都是黑色的,并且所有的叶节点都为空; (4)如果一个节点的红色的,那么它的两个孩子节点一定是黑色的 (5)任意节点到叶节点NIL指针的每一条路径都包含相同数目的黑原创 2017-04-21 16:13:16 · 599 阅读 · 0 评论 -
寻找最大的回文字符串
寻找最大的回文字符串,例如字符串adcdedco,那么最大的回文子串就是cdedc。原创 2017-05-01 21:37:33 · 898 阅读 · 0 评论 -
判断字符串是否回文
回文字符串有个特性,即不管是正着读还是反着读都是一样的,例如adcba. 判断回文的代码实现如下:package com.threeTop.www;/** * 判断一个字符串是否为回文串 * @author wjgs * */public class StringUtils { /** * 判断回文字符串 * @param str * @return原创 2017-05-01 16:46:16 · 932 阅读 · 0 评论 -
反转字符串
给定一个字符串,反转指定的部分。比如字符串为abc,全部反转为cba; 如果字符串为abcdefg,那么反转下标2-4的部分,字符串变为abedcfg。 使用对换反转法的实现代码如下:package com.threeTop.www;/** * 字符串的反转 * @author wjgs * */public class Reverse { /原创 2017-05-01 16:26:57 · 623 阅读 · 0 评论 -
排序算法---冒泡排序
冒泡排序:重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并且一直重复这样的走访操作,直到没有要交换的数据元素为止。 冒泡排序排序过程:原创 2017-04-15 16:58:46 · 450 阅读 · 0 评论 -
排序算法---桶排序
算法分析:找出最好、最适合的算法来解决问题,而算法复杂度可以分为两个部分: 时间复杂度和空间复杂度、稳定性。 (1)快而简单的排序---桶排序 桶排序的适用场景:数据分布相对比较均匀或数据跨度范围并不是很大。 桶排序的时间复杂度: O(n+m),n为待排序的元素的个数,m为桶的个数。 桶排序的实现代码如下:packa原创 2017-04-15 16:20:44 · 606 阅读 · 0 评论 -
查找算法总结
本章介绍了几个基础的查找算法:顺序查找、二分查找、行列递增的矩阵查找、分块查找。以后还会介绍其他查找算法:深度优先查找、广度优先查找、二叉树查找等。 顺序查找:不需要数列本身有序,查找性能太差,平均查找长度为(1+n)/2,时间复杂度为O(n). 二分查找:要求数列有序 行列递增的矩阵查找:按照杨氏矩阵特殊的存储方式 分块查找:顺序查找和二分原创 2017-04-19 09:32:31 · 470 阅读 · 0 评论