数据结构与算法
文章平均质量分 60
草帽小子Coder
这个作者很懒,什么都没留下…
展开
-
数据结构之AVL树
AVL树平衡二叉树和AVL平衡二叉树的定义:对于任意一个节点,左子树和右子树的高度差不能为超过1AVL树:既是平衡二叉树又是二分搜索树的树是AVL树(保持平衡的目的是为了防止二分搜索树退化成链表)AVL树是一种最为经典的平衡二叉树满二叉树是一种平衡二叉树完全二叉树是平衡二叉树线段树不是一个完全二叉树,但是一个平衡二叉树判断是否是二分搜索树//判断是否是二分搜索树public boolean isBST() { ArrayList<K> keys = new原创 2021-12-09 22:15:13 · 497 阅读 · 0 评论 -
数据结构-队列
2 队列队列是一种先进先出的数据结构First in First out2.1 数组队列的实现Queuevoid enqueue(E),队尾添加数据,复杂度O(1)E dequeue(),队首去除数据,复杂度O(n)boolean isEmpty()int getSize()2.2 定义队列接口public interface Queue<E> { int getSize(); boolean isEmpty(); void enqueue(E原创 2021-09-07 23:31:14 · 356 阅读 · 0 评论 -
数据结构-数组
1、数组1.1 使用java中的数组public class Test{ public static void main(String[] args){ int[] arr = new int[10]; for(int i=0 ; i<arr.length ; i++){ arr[i] = i; } int[] scores = new int[]{100,99,88}; f原创 2021-09-05 17:43:21 · 331 阅读 · 0 评论 -
基本数据结构之栈
基本数据结构之栈前言继前一篇文章后面,本文这里聊一聊一种非常重要的数据结构—栈,提到栈大家都会想到先进后出或者后进先出。正是因为栈的这种特点,使得栈这种数据结构具有非常广泛的应用,比如在浏览器进行上网时,当你需要撤回到前面一个网页时,你需要点击后退键返回到上一级网页进行浏览;当你使用PPT、Word进行图像或者文字处理时,如果出现了错误,需要前面的结果时,这时候也需要撤回功能;此外,还有很多...原创 2020-04-14 17:20:59 · 309 阅读 · 0 评论 -
图像梯度的基本原理
图像梯度图像梯度基本原理图像就是函数原创 2019-06-03 10:11:55 · 434 阅读 · 0 评论 -
把二叉树打印成多行
题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:这里 思路类似于前面的一篇从上往下打印二叉树,都是从上往下,从左到右的思路,最主要的方法就是利用队列,把数据推入队列中,可以使用两个队列,也可以使用一个队列,使用两个队列,一个出数据(压入到容器),一个进数据(出数据的左右子树,每出一个,推入相应的左右子树),当其中一个空了,互换两个队列的进出顺序,使用...原创 2019-06-06 23:07:19 · 106 阅读 · 0 评论 -
左旋转字符串
题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路:这里用到的还是对字符串翻转,相当于镜像的位置互换,这里是往左移动n个位置,同...原创 2019-06-01 17:59:37 · 109 阅读 · 0 评论 -
和为S的连续正数序列
题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!思路:思路1:从第一个1为首...原创 2019-06-01 13:53:04 · 109 阅读 · 0 评论 -
和为S的两个数字
题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。思路:思路1:利用哈希表的方法,先遍历每个数据,建立映射,再从头开始看hash[S-data[i]]是否为零,不为零就存在这个数,用完一次要减1,因为可能存在相同的数据,与此同时记录最小值,一直到遍历结束。思路2:利用排序的特点,从两...原创 2019-06-01 11:06:06 · 168 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目描述:统计一个数字在排序数组中出现的次数。思路:最基本的思路就是根据排序数组的特点进行二分法定位,定位会出出现的情况时,K可能是第一个,可能是中间某一位置,也可能在最后一个,所以定位到K后,再往左边遍历直到不为K为止,再从定位位置往右遍历直到不为K为止,这样就能计算出K的总数,除此之外,还有加强版的二分法直接定位到K的边界位置,即第一个或者最后一个K的位置,这样就能直接往一个方向遍...原创 2019-05-28 23:44:07 · 138 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述:输入两个链表,找出它们的公共节点思路两个链表若有公共节点,那么在公共节点之后的一部分两个链表的节点是一样的,那么在公共节点之前,两个链表的前半段之差就是两个整链表之差,所以先求出两个链表之差d,先遍历长一些的链表d个节点,然后从此时遍历到的节点同时也遍历短一些的链表,直到遍历到两个链表值相等时就是公共节点。代码:class solution{ public: ...原创 2019-05-28 21:56:12 · 106 阅读 · 0 评论 -
数组中只出现一次的数字
题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。思路:有多种思路,第一、采用哈希表的方式,虽然时间复杂度是O(1),但是还是空间复杂度为O(n),第二、采用异或的方法,使用异或,当只有一个数字只出现一次的时候,对整个数组异或运算,最后的结果肯定是这个只出现一次的数字(因为相同的数字异或都为零了),因为这里只有两个数不相同的,在...原创 2019-05-31 13:48:36 · 146 阅读 · 0 评论 -
平衡二叉树
题目描述:输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路:(后续遍历)使用深度优先搜索的后续遍历的的方法,因为后续遍历的遍历顺序是左右根的访问顺序,所以对于每个节点,首先判断子树是否是平衡二叉树,如果子树是平衡二叉树,记录此时该子树的深度(用于与其他子树后续其他的判断),如果不是则整个二叉树就不是平衡二叉树,下面使用递归的方式遍历。代码:class solution...原创 2019-05-31 10:56:27 · 143 阅读 · 0 评论 -
对称二叉树
题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:使用递归与非递归两种方法实现该函数,递归法肯定要判断左子结点的的左子结点值与右子节点的右子节点值是否相等,左子结点的右子节点值与右子节点的左子结点值是否相等,当存在有两者都不为空时也满足对称,当只有其中一个为空或者两者都不为空的情况下值不相同则不满足对称,递...原创 2019-06-05 12:06:19 · 172 阅读 · 0 评论 -
翻转单词顺序列
题目描述:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路:和前...原创 2019-06-01 21:33:12 · 152 阅读 · 0 评论 -
序列化二叉树
题目描述:使用任意一种遍历算法将二叉树拼成一个字符串,NULL指针用符号代替。思路:使用前序遍历,中序遍历,后续遍历都能正常转换,关于深度遍历已经详细阐述,但是为空的地方(有的树没有左或者右子树),用符号代替,对于反序列化,要将一个字符串转换为一个二叉树,对应的特殊字符在二叉树中代表为空,首先要将前面二叉树转换成的字符串中的!去除,在遍历去除!后的字符串时,当遇到#(前面二叉树中为...原创 2019-06-07 14:54:17 · 116 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解读:此题用STL容器方法非常简单,把奇数和偶数分别按顺序放在两个容器中,遍历完后,把偶数插入奇数容器末尾即可代码 :class solution{ public: void fun...原创 2019-04-23 09:35:24 · 114 阅读 · 0 评论 -
滑动窗口的最大值
题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],...原创 2019-06-12 12:05:24 · 7105 阅读 · 5 评论 -
删除链表中重复的结点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。思路:设置两个节点指针,一个pCur记录当前节点,一个pNext记录当前节点后面的一个节点(遇到重复节点才用到),如果当前节点pCur的值与pCur-...原创 2019-06-04 22:27:39 · 128 阅读 · 0 评论 -
二叉搜索树的第K个节点
题目描述:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路:基于搜索二叉树的中序遍历可以按顺序从小到大遍历到每个节点,因此当通过中序遍历遍历到第k个节点就是第k小的节点。代码(递归):class solution{ public: TreeNode* result=NULL; ...原创 2019-06-11 10:59:03 · 124 阅读 · 0 评论 -
八大排序算法
八大排序:目录八大排序:冒泡排序直接插入排序希尔排序快速排序简单选择排序堆排序归并排序基数排序冒泡排序排序过程:从第一个往后进行相邻元素遍历,如果前一个元素大于后一个元素,则交换两者的位置,遍历完一轮就能确定最后一个元素为该次遍历总长度的最大值,而且每遍历一轮,下次遍历的元素个数减1,所以对于n个元素的数组,遍历n-1轮完成排序过程,第一轮确定n...原创 2019-06-15 17:43:51 · 266 阅读 · 0 评论 -
字符流中第一个不重复的字符
题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。思路:两种思路:哈希表,建立哈希表,输入字符,记录字符,把每个字符都遍历到,对每个字符出现的次数计数,遍历完后就能依据哈希表知道首先仅出现次数为1的字符。 ...原创 2019-06-03 15:56:52 · 109 阅读 · 0 评论 -
把字符串转换成整数
题目描述:将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。注意:字符串数字之前可能包括空格和正负号。思路:需要注意的是可能包括正负号和空格,以及后面值得大小范围,首先必须要遍历到数字开始的位置,该位置之前一个位置一定会...原创 2019-06-03 14:05:18 · 337 阅读 · 0 评论 -
数组中重复的数字
题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路:两种思路:利用哈希表,不过这样空间复杂度为O(n),虽然时间复杂度为O(1),先遍历所有元素,存入...原创 2019-06-03 13:32:19 · 100 阅读 · 0 评论 -
自动聚焦算法
无参考图像的清晰度评价方法 from: http://nkwavelet.blog.163.com/blog/static/227756038201461532247117 在无参考图像的质量评价中,图像的清晰度是衡量图...转载 2019-06-03 09:26:46 · 8622 阅读 · 3 评论 -
二叉树的下一个结点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:看该节点是否存在右节点,如果存在右节点,则下一个节点是该节点的右节点的最左子节点(从该右节点一直往左子结点遍历),直到没有左子结点为止。 如果不存在右节点,则分为两种情况,看该节点是其父节点的左子结点还是右子节点:如果是左子结点的...原创 2019-06-05 10:16:25 · 130 阅读 · 0 评论 -
二分法搜索与哈希表
二分法搜索与哈希表的使用在寻找排序数组中的某一个数字的时候可以使用二分法与哈希表的方式,哈希表时间复杂度是o(1),但是空间复杂度增大了,需要把所有存入哈希表内,而二分法就比较简单了,只需要进行折半查找。哈希表:从头到尾遍历每个数据,存入哈希表,下表当做key,数组中的值当做value,直接搜索就能求得位置。二分法:比如数组M[n]中0~n-1的数据,寻找m,第一次搜索看M[(...原创 2019-05-30 16:20:49 · 609 阅读 · 0 评论 -
剑指offer二叉树镜像
题目:操作给定的二叉树,将其变换为源二叉树的镜像。解读:从树的根节点开始遍历,遍历到根节点,然后看有没有左右子节点,如果有的话,交换他们的左右位置 递归遍历,对于每一个节点,遍历它的子节点,如果存在即交换位置,直到遍历到没有子节点为止如下图所示,形象表述了镜像的整个过程,对于镜像操作,有两种方案,一种是使用递归的方式,一种是非递归方式,前者较简单一些,后者稍微复杂。...原创 2019-04-25 11:06:35 · 243 阅读 · 0 评论 -
二叉树的深度优先搜索和广度优先搜索
对于二叉树有两种搜索方式:深度优先搜索与广度优先搜索,而深度优先搜索分为前序,中序,后序三种遍历方式,下面给几种遍历方式一 一解释。深度优先搜索:前序遍历,访问节点顺序:根节点--->左子节点--->右子节点(根节点在最前面被访问) 中序遍历,访问节点顺序:左子节点--->根节点--->右子节点(根节点在最中间被访问) 后续遍历,访问节点顺序:左子节点---&g...原创 2019-04-28 21:28:15 · 3673 阅读 · 0 评论 -
带头节点的双向循环链表的基本操作
双向循环链表:双向循环链表中每一个节点都有一个直接的前驱和一个直接的后继双向循环链表中的节点有两个指针域和一个存放数据的地方,两个指针域一个存放下一个节点的地址,一个存放前一个指针的地址下面是双向循环链表的基本操作:CircularList.h#ifndef _LINKLIST_H_#define _LINKLIST_H_#include<stdlib.h>...转载 2019-03-31 09:53:01 · 1376 阅读 · 1 评论 -
最重要的十年怎么做才能让自己有最好的成长
前言从 20 岁到 30 的十年,有的人在念书,有的人初涉职场拼搏,有的人在蹉跎岁月、很多时候,我们在浪费了这最宝贵最美好最精力旺盛的十年之后,才醒悟过来:十年,不长但也绝对不短的时间,竟被我们的无知碾压而过,而我们什么都没做成,自此 30 岁以后,我们过得苦逼又压抑,还哀叹命运不济。如果再给你 20 岁到...转载 2019-02-28 11:39:18 · 185 阅读 · 0 评论 -
人生感悟
为人处世,请从学会闭嘴开始!春秋·孔子《论语·卫灵公》:可与言而不与之言,失人;不可与言而与之言,失言。知者不失人,亦不失言。混迹社会,与人相处,讲话是一门学问,该讲的话却没讲,容易失去朋友;不该讲的话却说了,则容易犯错!在特定条件下,什么是人生不可讲的话?被忽略时想抱怨的话 &nb...转载 2019-03-21 19:39:22 · 144 阅读 · 0 评论 -
循环队列
数组表示的问题 对于队列最好的方法是使用链表实现,因为对于数组来说,队列可能会出现下面这种情况: 如图所示,不可以继续添加元素,否则会造成数组越界而遭致程序出错。然而此时又不应该扩充数组,因为还有大量实际空间未被占用。 此时我们应该如何解决这个问题呢?我们将其实现为循环队列。理解循环队列 何谓循环队列?首先我们要说明的是循环队列仍然是基于数...原创 2019-03-13 09:46:36 · 14869 阅读 · 0 评论 -
快速排序
快速排序 快速排序,说白了就是给基准数据找其正确索引位置的过程. 如下图所示,假设最开始的基准数据为数组第一个元素23,则首先用一个临时变量去存储基准数据,即tmp=23;然后分别从数组的两端扫描数组,设两个指示标志:low指向起始位置,high指向末尾. 首先从后半部分开始,如果扫描到的值大于基准数据就让high减1,如果发现有元素比该基准数据的值小(如上图中18<...转载 2019-03-04 20:18:52 · 117 阅读 · 0 评论 -
希尔排序
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37818081/article/details/79202115 </div> <div id="content...转载 2019-03-04 20:07:14 · 141 阅读 · 0 评论 -
链表讲解
c语言链表详解(超详细)链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指...转载 2019-03-03 23:11:03 · 257 阅读 · 0 评论 -
二叉树搜索的后序遍历序列
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同解读:这里用到的后续遍历在我的这篇博客已经用图解形式解释,而二叉搜索树的规则是左子结点值小于根节点值,根节点值小于右节点值,所以最后一个元素肯定是根节点,而且那么在该数列根节点前面的前一段肯定是小于该根节点值,根节点前的后一段是大于该根...原创 2019-04-29 21:56:28 · 391 阅读 · 0 评论 -
求最小的K个数
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解读:首先想到的就是利用排序的方式,将整个数列从小到大排序,从排序后的数列中就能得到最小的K个数 利用STL容器中Partition算法可以使得把数列按照大于和小于平均值分成两部分放在左右两边并且可以得到中间数据的位置,这样就可以利用这种算法,进行...原创 2019-05-19 00:04:52 · 331 阅读 · 0 评论 -
二叉树的深度
题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:此题大体思路和前面博客二叉树中和为某一值的路径基本一致,借助于栈,把访问到的数据保存在栈中,当到达某一叶子节点时,计算栈中的数据个数,并与最大值比较,求得最大值,当二叉树所有节点访问结束便能求得二叉树的深度。struct TreeNode...原创 2019-05-30 11:31:33 · 169 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解读:经过仔细分析可以知道,如果要该数字出现的次数超过数组长度的一半,则等价于目标数字出现的次数大于其它数字出现的总和,比如题目中的2是出现次数超过一半的,如果删除...原创 2019-05-18 11:28:32 · 278 阅读 · 0 评论