数据结构与算法
Master_Yoda
Named after the name of God,by your hands!
展开
-
leetcode根据数组创建一棵二叉树(用于测试)
最近一直在刷题,很多树的题目,用例都是一个数组,这样的话自己测试起来就比较麻烦,所以自己写 了一个工具类,专门用于生成测试用的二叉树。本例中所构建的树的结构 5 / \ 4 8 / / \ 11 13 4 / \ \7 2 1对应的数组是:{5, 4, 8, 11, null, 13, 4, 7, 2, null, null, 5, 1}我的思路参考了这篇文档:https://blog.csdn.net/lenfr原创 2020-07-21 16:12:57 · 4726 阅读 · 3 评论 -
对一个数组排序之后求相邻数的最大差值
题目:给定一个整形数组arr,返回排序后的相邻两数的最大差值。时间复杂度为O(N)。解答:如果用排序法实现,其时间复杂度为O(NlogN),而如果利用桶排序的思想(不是桶排序),可以做到O(N),额外空间复杂度为O(N)。遍历arr找到最大值max和最小值min。如果arr的长度为N,准备N+1个桶,把max单独放在第N+1个桶中,[min,max)范围上的数放在1N号桶里,对于1N号桶中...原创 2020-04-03 16:37:58 · 1966 阅读 · 0 评论 -
图解大根堆的堆排序
文章目录1 大根堆2 创建堆,heapInsert1 大根堆进行堆排序之前,需要先明确大根堆的概念,大根堆就是根节点是整棵树的最大值(根节点大于等于左右子树的最大值),对于他的任意子树,根节点也是最大值。大根堆有两个操作,一个创建堆heapInsert时间复杂度是O(N),还有一个操作是当大根堆里的某个节点的值,发生变化的时候,需要对这个大根堆进行调整,每一次调整时间复杂度是O(lg(N)),...原创 2020-03-30 22:09:55 · 55407 阅读 · 7 评论 -
Leetcode第5题Longest Palindromic Substring
昨天做了Leetcode上的第5题,求一串字符串的最长回文子串,刚开始自己想了一种方式,本来以为挺简单的,但是经过了一个多小时的努力,终于发现了自己的错误,思路是错的,然后参考了网络上的答案,最终写出来了:O(n^2)时间复杂度方法——从中心向外扩散1.思想:1)将子串分为单核和双核的情况,单核即指子串长度为奇数,双核则为偶数;2)遍历每个除最后一个位置的字符index(字符位置),单核:...原创 2019-03-13 09:47:04 · 185 阅读 · 0 评论 -
二叉树先序、中序、后序的递归和非递归实现
1 二叉树的创建今天看了一下二叉树,突然发现书上讲了它的遍历方式,却没有讲如何创建二叉树,如果不先创建的话,我感觉即使写出了遍历的代码,也没法遍历啊。真的是觉得很奇怪!这里附上我写的代码,首先我这棵树我是用数组先存的,按照完全二叉树存的,没有节点的地方值为0结构如下: int[] arr = { 1, 2, 3, 4, 5, 0, 0, 0, 0, 6, 7 }; int index =...原创 2019-03-23 21:33:45 · 1012 阅读 · 1 评论 -
排序算法笔记一之插入排序
1 选择排序思想:首先找到数组中最小的那个元素,其次,将它和数组的第一个元素交换(如果第一个元素就是最小元素那么它就和自己交换),再次,在剩下的元素中找到最小的元素,将它与数组的的第二个元素交换位置,如此往复,直到将整个数组排序。这种方法叫做选择排序,因为它不断地选择剩余元素之中的最小者。...原创 2019-03-30 20:49:57 · 186 阅读 · 0 评论 -
二叉平衡树
定义:空二叉树的高度为-1,只有根节点的二叉树高度为0,根节点在0层,深度为0。原创 2019-04-11 14:14:51 · 344 阅读 · 0 评论 -
二叉搜索树(BST)笔记
二叉查找树(Binary Search Tree): 它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。树的节点的定义:public class TreeNode { int val; TreeNode left; TreeNod...原创 2019-04-08 11:37:37 · 196 阅读 · 0 评论 -
归并排序笔记
思想:将两个的有序数列合并成一个有序数列,我们称之为"归并"。归并排序:如果要将一个数组排序,可以先(递归地)将它们分成两半进行排序,然后将结果归并起来。下面介绍另外两种方法,分别是自顶向下归并和自底向上归并,图示参考连接:https://www.cnblogs.com/chengxiao/p/6194356.html但是我感觉里面的那个自下而上的算法感觉有点复杂,所以我总结了算法第四版上的...原创 2019-04-03 14:14:01 · 177 阅读 · 0 评论 -
图的广度优先搜索和深度优先搜索的代码
public class Graph { private static int numOfVexs;// 顶点的实际数量 private static int maxNumOfVexs;// 顶点的最大数量 private VNode[] vNodes; public int getNumOfVexs() { return numOfVexs; } public void se...原创 2019-04-16 21:46:10 · 645 阅读 · 0 评论 -
全排列算法递归实现
public static ArrayList<ArrayList> permute(int[] num) {ArrayList<ArrayList> list = new ArrayList<>();ArrayList temp = new ArrayList<>();boolean bool[] = new boolean[num.leng...原创 2019-04-28 14:46:52 · 285 阅读 · 0 评论 -
汉诺塔问题
之前一直觉得汉诺塔问题很难,今天看了视频,利用递归的思想,觉得好像不是那么难。这里使用三根柱子,分别是from,to,help,to是我们最终要放的柱子,help是辅助的柱子,步骤如下:先把1~n-1挪到help上把n挪到to上把1~n-1挪到to上具体代码如下:public static void process(int N, String from, String to, S...原创 2019-05-04 16:11:00 · 295 阅读 · 0 评论 -
生小牛问题
题目:母牛每年生一只母牛,新出生的母牛成长三年后也能每年生一只 母牛,假设不会死。求N年后,母牛的数量如果每只母牛只能活10年,求N年后,母牛的数量。第一个可以通过书写前几项得出规律:f(n)=f(n-1)+f(n-3)这个可以用递归的代码和非递归的代码来实现:递归代码:public static int cowNumber1(int n) { if (n < 1) { ...原创 2019-05-04 20:11:24 · 561 阅读 · 0 评论 -
快排的实现代码
具体的实现代码如下:public void quickSort(int[] arr, int left, int right) { // 当左边大于于右边的时候直接返回 if (right <= left) return; int key = arr[left];// 进行划分的值 int i = left, j = right;// while (i <...原创 2019-05-09 10:48:37 · 9494 阅读 · 2 评论 -
常用算法之回溯法
一. 回溯法 – 深度优先搜素 1. 简单概述 回溯法思路的简单...转载 2019-05-17 10:25:03 · 423 阅读 · 0 评论 -
Leetcode之无重复字符的最长子串
public int lengthOfLongestSubstring(String s) { int maxLength = 0; char[] chars = s.toCharArray(); for (int j = 0; j < chars.length; j++) { int len = 0; int[] arrs = new int[127]; fo...原创 2019-03-12 13:08:23 · 115 阅读 · 0 评论 -
LeetCode第8题字符串转换成整数
这道题是中等难度的题,确实想了好长时间,因为老是有一些情况没有考虑到,不过最后还是把条件都分清楚了,首先我们需要先把字符串给去掉首尾的空格,其次,还要分为以下几种情况:字符串本身就是一个空字符串,应直接返回0字符串不是以±以及数字开头的,应直接返回0字符串以+开头的,应进行处理字符串以-开头应进行处理字符串以数字开头应进行处其中,字符串以正号和负号开头的,还需要考虑一种特殊情况,就...原创 2019-03-15 19:39:09 · 308 阅读 · 0 评论 -
循环链表的建立,查找,删除
循环链表的建立,删除,查找,插入原创 2016-12-08 09:25:44 · 485 阅读 · 0 评论 -
数据结构与算法之排序
简单的排序算法有冒泡排序、选择排序和插入排序,今天在这里总计一下各种排序算法的知识,方便以后再看的时候用到。冒泡排序执行的算法如下:假如现在有一个队伍,人数为N,需要按从低到高的顺序从左到右排序:从队列的最左边开始,比较0号位置的队员和1号位置的队员。如果左边的队员比右边的高,就让两个队员交换,如果右边的队员高就什么也不做,然后右移一个位置,比较1号位置和2号位置的队员,然后如果左原创 2017-01-25 12:17:00 · 208 阅读 · 0 评论 -
数据结构与算法之栈和队列
数据结构之栈和队列原创 2017-01-25 12:18:47 · 270 阅读 · 0 评论 -
数据结构与算法之二叉树
数据结构二叉树的相关操作原创 2017-02-26 15:26:33 · 234 阅读 · 0 评论 -
寻找数组中的主元素
在一个数组中寻找主元素所谓主元素就是在一个数组中的某一个元素所出现的的次数大于大于数组长度的1/2算法的基本思想该算法的基本思想就是从前向后扫描数组元素,标记出一个可能成为主元素的元素Num,然后重新计数,确认Num是否是主元素。算法的基本步骤1、选取候选的主要元素:依次扫描所给数组中的每一个整数,将第一个遇到的整数Num保存到c中,记录Num出现的次数为1,若遇到的下一个整数仍等于Num,则计算器原创 2017-05-22 23:18:07 · 6228 阅读 · 3 评论 -
数据结构与算法笔记一
数据结构的基本概念:数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机并被计算机程序识别和处理的符号的集合。 数据元素:数据元素是数据的基本单位,通常作为一个整体进行考虑和处理,一个数据元素可由若干个数据项组成,数据项是构 成数据元素的不可分割的最小单位。如:学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成。原创 2017-04-23 21:42:18 · 546 阅读 · 0 评论 -
设计一个递归算法,删除不带头结点的单链表中所有值为x的结点
设计一个递归算法,删除不带头结点的单链表中所有值为x的结点具体的代码如下:void Del_X_3(LinkList &L,ElemType x) { LNode *p; //p指向待删除结点,if(L==NULL) //递归出口 return ; if(L->data==x) { p=L; L=L->next; //删除L,并让L指向下一原创 2017-05-28 22:29:28 · 13293 阅读 · 11 评论 -
寻找两个数组的中位数
找出两个升序序列的中位数1.算法要求一个长度为L(L≥1)的升序序列S,处在第L / 2(若为小数则去掉小数后加1)个位置的数称为S 的中位数。例如,若序列S1=(11,13,15,17,19),则S1 的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1 和S2 的中位数是11。现在有两个等长升序序列A 和B,试设计一个在时间和空间两方原创 2017-05-22 13:23:35 · 895 阅读 · 0 评论 -
单链表逆置
单链表逆置最近在看数据结构与算法,刚看到链表,遇到了一个很有意思的题目,单链表逆置换,这里总结一下带头结点的单链表我找到了两种方法:第一种:利用头插法就是将头结点摘下,然后从第一结点开始,依次插入到头结点的后面,直到最后的一个结点为止。 具体代码如下:LinkList Reverse_1(LinkList &L) { LNode *p,*r;//p为工作指针,r为后继指针 p原创 2017-06-02 21:55:52 · 679 阅读 · 1 评论 -
串的简单模式匹配和KMP算法
串的简单模式匹配和KMP算法 所谓串就是指字符串,在计算机中是一种很常见并且很重要的数据结构,我们平时所处理的文档实际上就是字符串。而对字符串的操作中比较常见的一种就是对一个串中某子串进行定位也就是模式匹配。其中待定位的子串称为模式串,简单模式匹配算法的思想是:从主串的第一个位置和模式串的第一个字符开始比较,如果相等,则继续逐一比较后续字符;否则从主串的原创 2017-08-31 14:24:56 · 7699 阅读 · 1 评论 -
算法第四版开发环境的配置
最近突然想学一下数据结构与算法的知识。开始看算法第四版这本书,然后准备写代码,却发现作者给的开发环境的配置并不是很详细,然后在网上百度到的答案也都五花八门,这里总结一下:首先是JDK的配置,由于现在jdk已经不需要配置CLASSPATH这个环境变量了,但是这次需要配置,因为我们在使用命令行编译的时候,要用到algs4.jar这个包,没法像普通的java文件使用javac 和java命令来编译和运...原创 2018-12-22 18:58:51 · 1547 阅读 · 0 评论 -
设计一个有getMin功能的栈
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回值的栈中最小元素的操作 要求pop、push、getMin操作的时间复杂度都是O(1)有两种设计方案:第一种设计方案如下:实现思路,在设计上我们使用两个栈,一个栈用来保存当前栈中的元素,这个栈记为stackData,另一个栈用于保存每一步的最小值,这个栈几位stackMin 具体的实现方式有两种 第一种: 压入数据规则:假设当前数...原创 2019-03-02 18:42:05 · 248 阅读 · 0 评论 -
用两个栈实现队列
队列是先进先出,栈是先进后出,所以如果想用栈实现队列的话,就可以使用一个栈当作压入栈,压入数据时,只往栈压入数据,记为stackPush,一个栈当作弹出栈,弹出数据时只从这个栈弹出,记作stackPop.但是需要注意以下几点:如果stackPush要往stackPop中压入数据,必须一次性把stackPush中的数据全部压入如果stackPop不为空,stackPush绝对不能向stackP...原创 2019-03-04 19:51:17 · 99 阅读 · 0 评论 -
Leetcode第6题ZigZag,Z 字形变换
今天刷了leetcode第6题,Z字形变换,后来终于解决了。这里附上源码:LinkedList[] list = new LinkedList[numRows]; for (int i = 0; i < numRows; i++) { list[i] = new LinkedList<Character>(); } int length = 0; whil...原创 2019-03-14 19:15:17 · 226 阅读 · 0 评论 -
Leetcode第7题整数反转(Reverse Integer)
这道题是一道简单题,但是我还是花了不少时间给做出来,这里还是总结一下吧,只所以花了那么久,我觉得还是因为自己的思路有点问题,我刚开始的思路是我先把这个要反转的数先给它转成字符串,然后再反转,接着再给它变成整数,但是由于刚开始,我是整体考虑的,后来又发现要把负数和正数给分开,但是逻辑太混乱了,所以一直出来,然后我仔细想了一下,我实际上完全没有必要把这个整数给先转成字符串,然后再进行反转,我可以直接通...原创 2019-03-15 11:25:50 · 144 阅读 · 0 评论 -
数据结构单链表的建立、删除
单链表的建立,查询,删除,插入原创 2016-12-08 09:21:31 · 515 阅读 · 0 评论