数据结构与算法
Shao Kaiyang
BIT && BUAA,云计算相关
展开
-
数据结构与算法学习经典书单汇总
数据结构与算法学习书单推荐引自 Google 工程师 王争 推荐针对入门的趣味书《大话数据结构》其把理论讲的很有趣,不枯燥。针对每个数据结构和算法都结合生活中的例子进行了详解。《算法图解》“像小说一样有趣的算法入门书”。针对特定编程语言的教科书《数据结构与算法分析:C语言描述、C++描述、Java描述、JavaScript描述、Python描述》面试必刷宝典《剑指...原创 2019-05-02 17:06:26 · 1241 阅读 · 0 评论 -
KMP算法详细介绍及Java实现
问题KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算机程序设计艺术》神作的作者。KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。举个例子:...原创 2019-05-11 02:08:57 · 504 阅读 · 0 评论 -
给定一个整数数组,求a[i]+a[j]+i-j的最大值—头条笔试题
问题给定一个整数数组,求数组中两个数关于公式 a[i]+a[j]+i-j 的最大值,即找两个数,这两个数相加并减去两个数之间的下标距离,求得最大值。例如:input:31 2 3output:4(选择的两个数是2和3)扩展:这个题目可以有变形,例如求一个数组中两数和的最大值,两数差的最大值,或两数和差和某些变量构成的公式的最大值。思路(1)基本思路:暴力搜索,遍历每一个数对,进...原创 2019-05-25 11:57:58 · 2282 阅读 · 0 评论 -
二维矩阵中1所构成的块个数(孤岛问题)—头条笔试题
问题给定一个二维数组,数组中仅包含0和1,上下左右和对角线相连的1构成一个块,求该二维数组中块的个数。例如:input:31 0 11 1 01 0 1output:2(最后一个1构成一个单独的块)思路(1)采用深度优先搜索,遍历1在数组中的位置,对于遍历得到的1,先将其置位0再递归遍历该位置周围8个方向上是否为1,如果为1将其值变为0。这样顺次得到的1的个数就为最终结果;(...原创 2019-05-25 12:11:45 · 1955 阅读 · 2 评论 -
链表—删除一个未排序链表中的重复节点
问题删除一个未排序链表中的重复节点,例如输入:1-4-2-6-3-2-4-1输出:1-4-2-6-3方法方法:(1)使用hashset来检测节点是否重复,如果重复则删除节点;time:o(n)space:o(n)(2)不使用额外的空间,对于每一个节点,遍历后续节点看是否存在重复,如果重复则删除;time:o(n^2)space:o(1)/** * 问题:删除一个未排...原创 2019-05-17 20:04:24 · 2164 阅读 · 1 评论 -
Leetcode1--50题目思路简要整理
下面只是对LeetCode1–100题最优思路和核心代码的简要整理,以应对面试中的手撕代码环节。对于一般计算机专业出身的人来说,对于一个算法题目给定一个思路实现起来应该问题不大,关键在于找到这个思路。根据自己的面试经历来看,面试中的题目描述不会很复杂,一般情况下只要分析出思路很快就可以写出来。且大多数面试官喜欢在LeetCode中找一些小而简练的题目,前100道题目出现的频率很大。先把所有的考...原创 2019-08-22 17:05:35 · 483 阅读 · 0 评论 -
剑指offer题目解析简要总结
只简要总结最优解思路和一些核心代码1 二维数组查找描述:一个二维数组满足每一行从左到右递增,从上到下递增。给定这样数组和一个值,判断其是否在数组中。思路:从数组右上方开始寻找,如果当前值等于目标值返回,如果当前值大于目标值则剔除该列,如果当前值小于目标值则剔除该行。int row = 0;int column = n - 1;while(row < rows &&am...原创 2019-08-23 00:26:28 · 561 阅读 · 0 评论 -
单调栈与单调队列
简介单调栈:栈中的元素从栈底到栈顶满足单调性。以递增栈为例,如果新来元素大于等于栈顶元素则直接入栈,否则从栈顶开始依次将比新来元素大的元素出栈,以此来保证单调性。单调队列:队列中的元素从头到尾满足单调性。以递增队列为例,如果新来元素大于等于队尾元素则直接入队,否则从队尾开始依次将比新来元素大的元素出队,以此来保证单调性。单调栈和单调队列的概念很好理解,实现也很方便,关键在于应用,能够将一些算...原创 2019-09-01 18:53:40 · 514 阅读 · 0 评论 -
并查集与常见面试题总结
简介参考链接并查集是一种树形的数据结构,用于处理不相交集合的合并和查询问题。在判断连通图个数、朋友圈个数等有重要应用。并查集主要涉及三个基本操作:makeSet(n):初始化一个独立的集合,开始时每个元素的最高祖先为自身 parent[x]=x;findSet(x):寻找x所在集合的最高祖先,通过递归的方式进行查询,并且在查询时进行路径压缩。例如:开始有一个集合中1->2->...原创 2019-09-21 22:42:39 · 669 阅读 · 0 评论 -
字符串—给定isSubstring方法,判断一个字符串是否由另一个字符串翻转得到
问题给定isSubstring方法(经典的KMP算法,下面仅给出最一般的实现方式,在另一篇中专门解读KMP),判断一个字符串是否由另一个字符串翻转得到,例如abc,cab。分析如果符合题目条件,例如对于abc, cab他们有一些特征,这两个串都是由 ab 和 c 拼接得到的,只是拼接的顺序不同而已。所以存在下面的规律,S2是否是S1旋转得到,如果是则需要保证S2是S1S1的子串:S...原创 2019-05-10 21:36:05 · 1121 阅读 · 0 评论 -
数组—将一个M*N矩阵中0元素所在行和列清零
问题将一个M*N矩阵中0元素所在行和列清零。分析注意,不能一次遍历进行处理,如果一次遍历处理最终全部的元素都会变成0,需要首先将0元素的位置标记出来,然后第二遍遍历的时候再处理;一种可行的方式是,可以用一个大小相同的布尔数组来记录0元素出现的位置,但是这样的空间复杂度是o(nm),其实我们不需要记录这么多值,我们仅关注0元素所在的位置,甚至我们仅关注0元素所在的行和列,因为最终不管这些行...原创 2019-05-10 21:31:42 · 1222 阅读 · 0 评论 -
数据—将一个N*N矩阵顺时针旋转90度
问题1.6 问题:将一个N*N矩阵顺时针旋转90度(其他形如顺时针180度,或者逆时针90度都一样的思路),不占用额外空间实现按照规律一层一层逐个进行旋转/** * 1.6 问题:将一个N*N矩阵顺时针旋转90度(其他形如顺时针180度,或者逆时针90度都一样的思路),不占用额外空间 * 思路:一层一层逐个进行旋转 * time:o(n^2) * s...原创 2019-05-09 23:42:31 · 4001 阅读 · 0 评论 -
数据结构与算法学习导言
0. 为什么要学习数据结构与算法学习整理自 极客时间《数据结构与算法之美》专栏为什么要学习数据结构与算法?通过大厂面试;业务开发工程师,真的愿意做一辈子CRUD boy? 对阅读框架源码和理解其背后的设计思想很有用;基础架构研发工程师,写出达到开源水平的框架才是你的目标!高手对决看细节,这些细节包括算法是否优化、数据存取效率是否高、内存是否节省;对编程有追求,不想被行业淘汰,就不...原创 2019-05-02 17:11:47 · 240 阅读 · 0 评论 -
二分查找及其变体详细总结(附Java代码实现)
0. 二分查找及变体简介原创 2019-05-04 23:57:52 · 328 阅读 · 0 评论 -
二叉树基本操作汇总
0. 前言树结构是面试最长考察的一种数据结构,因为数这种结构的难度介于普通的数组和图之间,一般能够比较好的考察一个人的空间想象能力和对递归的使用。通常手写算法部分考察到树结构并不会很难,都是一些最基本的操作,例如前中后序遍历(某些大厂要求比较高,会让非递归方式实现,这个需要使用到栈进行存储,思考上有一定难度,后续会进行整理),构建一棵树,求数的深度,节点的个数等。只要理解树的结构和递归的过程,面...原创 2019-05-05 00:09:24 · 323 阅读 · 0 评论 -
字符串与数组—确定一个字符串的所有字符是否全部相同
0. 问题给定一个字符串,判断其中的字符是否全部相同,不允许使用额外的数据结构,保证空间复杂度为O(1)1. 实现比较好的实现方式是利用一个辅助数据来记录每个字符是否出现,即使用位图进行标记。这里需要注意判断题目中字符的编码方式,如果是ascII的方式,那么字符一共有256个,如果是Unicode的方式,每个字符会占用两个字节,表示的字符数增加,需要修改标记数组的大小。/** *...原创 2019-05-09 14:42:14 · 1010 阅读 · 0 评论 -
字符串—C++实现翻转一个null结尾的字符串
0. 问题用C或者C++实现翻转一个以null结尾的字符串,不得申请额外空间。1. 实现思路:不分配空间直接就地翻转,采用首位交换的方式进行,并去掉末尾的nulltime:o(n)space:o(1)void reverse(char *str){ char* end = str; char temp; if(str){ while(*end){ ++end; // 找到...原创 2019-05-09 17:27:08 · 378 阅读 · 0 评论 -
字符串—给定两个字符串,确定其中一个字符串重新排列后是否可以变成另外一个字符串
0. 问题给定两个字符串,确定其中一个字符串重新排列之后是否可以变成另外一个字符串。1. 实现注意:是否需要考虑大小写;是否需要考虑空格;下面的实现考虑大小写和空格;(1)对两个字符串分别排序,排序之后若相等则可以;代码书写尽可能追求模块化和简洁;/** * 判断一个字符串是否可以通过排序变成另外一个字符串 */ public static String...原创 2019-05-09 17:56:55 · 3507 阅读 · 0 评论 -
字符串—将一个字符串中的空格替换为固定格式内容
问题将一个字符串中的空格替换成“%20”,字符串替换操作在实际的工程有很重要的作用,有时候为了格式化或其他原因需要进行替换。实现思路:首先计算新的字符串的长度,然后从尾部进行替换;这样不会覆盖前面的数据。/** * 问题:将一个字符串中的空格替换为“%20”,假定字符串数组后面有足够的空间可以存放新增字符串,并且知道字符串的真实长度; * 思路:从后往前进行转换,这样不...原创 2019-05-09 23:12:29 · 698 阅读 · 0 评论 -
字符串—压缩字符串
问题将一个字符串进行压缩,例如 aabcccc 压缩后为a2b1c4如果压缩后字符串没有变短则返回原字符串,保证输入合法。实现从前往后顺次进行处理并添加到新字符串中。/** * 1.5问题: 压缩字符串。例如 aabcccc 压缩后为a2b1c4如果压缩后字符串没有变短则返回原字符串 * 思路:使用StringBuilder进行顺次处理 * time:o(n)...原创 2019-05-09 23:30:03 · 3461 阅读 · 1 评论 -
全排列JAVA实现
前言参考资料全排列:即所有的排列情况数,例如1,2,3的全排列包括:123,132,213,231,312,321这几种情况,可以通过编程实现。思路:fullSort方法接收三个参数,数组arr,起始位置start,终止为止end,意思就是完成arr数组从start到end之间记录的全排列。分两个步骤:(1)确定第一位的字符数组arr从start到end的所有记录都可以出现在第一个位...原创 2019-09-22 01:17:51 · 446 阅读 · 0 评论