数据结构与算法
文章平均质量分 62
Fly-ping
这个作者很懒,什么都没留下…
展开
-
LeetCode练习题【java】(3)
文章目录1、判断链表是否是环形链表(HashSet、双指针)2、合并两个有序数组(JavaAPI、双指针)3、子数组最大平均数(滑动窗口)4、最长连续递增序列5、柠檬水找零6、三角形的最大周长1、判断链表是否是环形链表(HashSet、双指针)/** * 环形链表 * 给定一个链表,判断链表中是否有环 * 如果链表中有某个节点,可以通过连续跟踪next 指针再次到达该节点,则链表中存在环 * 如果链表中存在环,则返回true。否则,返回false */public class Circula原创 2022-03-23 16:18:53 · 1092 阅读 · 0 评论 -
LeetCode练习题【java】(2)
文章目录1、三个数的最大乘积(线性扫描)2、无序数组的两数之和(暴力法、HashMap)3、无序数组的两数之和(二分法、双指针)4、求取斐波那契数列第N位的值(递归、双指针迭代)5、排列硬币(二分法、牛顿迭代)1、三个数的最大乘积(线性扫描)/** * 三个数的最大乘积 * 整型数组nums,在数组中找出由三个数字组成的最大乘积,并输出这个乘积。 * 乘积不会越界 * 重点考察:线性扫描 */public class ThreeNumbersMaxProduct { public s原创 2022-03-21 16:48:57 · 691 阅读 · 0 评论 -
LeetCode练习题【java】(1)
文章目录1、单链表的反转(迭代、递归)2、 统计n以内的素数个数(暴力法、埃筛法)3、删除排序数组中的重复项(双指针法)4、寻找数组的中心下标5、求x的平方根(二分法、牛顿迭代)1、单链表的反转(迭代、递归)public class ReverseSingleList { public static void main(String[] args) { ListNode node5 = new ListNode(5, null); ListNode node4 =原创 2022-03-20 18:25:16 · 913 阅读 · 0 评论 -
四种常用的查找算法(顺序、二分、插值、斐波那契查找)
文章目录1、查找算法2、线性查找算法2.1、基本介绍2.2、代码实现3、二分查找3.1、基本介绍3.2、代码实现4、插值查找4.1、基本介绍4.2、代码实现5、斐波那契(黄金分割法)查找5.1、基本介绍5.2、代码实现1、查找算法常用的查找算法有四种:顺序(线性)查找二分查找 / 折半查找插值查找斐波那契查找 / 黄金分割点查找2、线性查找算法2.1、基本介绍【顺序查找】要求:如果找到了,就提示找到,并给出下标值。2.2、代码实现//顺序查找public class S原创 2022-03-15 09:48:59 · 521 阅读 · 0 评论 -
常用排序算法总结和对比
文章目录1、常用排序算法总结和对比2、算法的时间复杂度3、算法的空间复杂度1、常用排序算法总结和对比排序算法平均时间复杂度最好情况最坏情况空间复杂度排序方式稳定性冒泡排序O(n²)O(n)O(n²)O(1)In-place稳定简单选择O(n²)O(n²)O(n²)O(1)In-place不稳定直接插入O(n²)O(n)O(n²)O(1)In-place稳定希尔排序O(nlogn)O(nlog²n)O(nlog²n)原创 2022-03-02 17:10:52 · 2610 阅读 · 0 评论 -
归并排序和基数排序
文章目录1、归并排序1.1、归并排序基本介绍和思想1.2、归并排序代码实现2、基数排序2.1、基数排序基本介绍和思想2.2、基数排序代码实现1、归并排序1.1、归并排序基本介绍和思想归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。归并排序思想示意图1-基本思想:说明:原创 2022-02-28 16:37:03 · 674 阅读 · 0 评论 -
简单选择排序和堆排序
文章目录1、简单选择排序1.1、基本介绍1.2、代码实现2、堆排序2.1、基本介绍2.2、基本思想2.3、堆排序步骤图解说明2.4、代码实现1、简单选择排序1.1、基本介绍选择式排序也属于内部排序法,是从预排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。选择排序(select sorting)也是一种简单的排序方法。基本思想是:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]~arr[n-1]中选取最小值,与arr[原创 2022-02-27 22:34:35 · 519 阅读 · 0 评论 -
冒泡排序和快速排序
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始,,依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,再进行)1.2、代码实现//升序排序/原创 2022-02-26 12:02:26 · 463 阅读 · 0 评论 -
直接插入排序和希尔(shell)排序
文章目录1、直接插入排序1.1、基本介绍和思想1.2、代码实现2、希尔排序2.1、简单插入排序存在的问题2.2、希尔排序法介绍和基本思想2.3、交换法代码2.4、移动法代码(推荐)1、直接插入排序1.1、基本介绍和思想插入式排序属于内部排序法,是对于预排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从原创 2022-02-25 15:12:44 · 929 阅读 · 0 评论 -
【贪心算法】求解【集合覆盖问题】
1、贪心算法介绍贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果贪心算法注意事项和细节贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果比如下面一题的算法选出的是K1,K2,K3,K5,符合覆盖了全部的地区。但是发现 K2,K3,K4,K5 也可以覆盖全部地区,如果K原创 2022-02-23 08:45:42 · 1497 阅读 · 0 评论 -
【分治算法】解决【汉诺塔问题】
1、分治算法概述分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题…直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换.)…分治算法的基本步骤( 分治法在每一层递归上都有三个步骤):分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题解决:若子问题规模较小而容易被解决则直接解,否则递归地解各原创 2022-02-22 15:23:13 · 244 阅读 · 0 评论 -
图的基本介绍以及深度优先遍历和广度优先遍历
文章目录1、图的基本介绍1.1、图的定义1.2、图的表示方式2、图的深度优先遍历介绍2.1、图遍历介绍2.2、深度优先遍历基本思想2.3、深度优先遍历算法步骤3、图的广度优先遍历3.1、广度优先遍历基本思想3.2、广度优先遍历算法步骤4、图的应用示例1、图的基本介绍1.1、图的定义图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。结点也可以称为顶点。无向图:顶点之间的连接没有方向,比如A-B,即问以是A->B也可以B->A,无向图如下有向图:原创 2022-02-21 14:39:17 · 1121 阅读 · 0 评论 -
二叉排序树(BST)的创建、遍历和删除 _ java代码实现
1、基本介绍二叉排序树:BST: (Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点2、二叉排序树的功能实现示例,将数组Array(7,3,10,12,5,1,9,2),创建成对应的二叉排序树如图二叉排序树创建和遍历一个数组创建成对应的二叉排序树,思路是判断待加入原创 2022-02-20 16:21:51 · 285 阅读 · 0 评论 -
哈夫曼树(Huffman Tree)的介绍和创建
1、基本介绍哈夫曼树,别名“赫夫曼树”、“霍夫曼树”、“最优树”以及“最优二叉树”给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree),还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。赫夫曼树几个重要概念和举例说明路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结原创 2022-02-19 11:33:31 · 883 阅读 · 0 评论 -
线索化二叉树的创建与遍历_ java代码实现
1、简单介绍n个结点的二叉链表中含有n+1【公式2n-(n-1)=n+1】个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种在某种遍历次序下,一个结点的前一个结点,称为前驱结点在某种遍历次序下,一个结点的后一个结点,称为后继结点2、线原创 2022-02-18 15:55:38 · 177 阅读 · 0 评论 -
顺序存储二叉树【以数组方式存储树】
1、介绍基本说明从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树第n(指下标)个元素的左子节点在数组中的下标为2 * n + 1第n(指下标)个元素的右子节点在数组中的下标为2 * n + 2第n(指下标)个元素的父节点在数组中的下标为(n-1) / 2n :表示二叉树中的第几个元素(从0开始编号)2、顺序存储二叉树前序遍历代码实现需求:一个数组1,2,3,4,5,6原创 2022-02-17 09:45:59 · 1353 阅读 · 0 评论 -
二叉树的遍历(前序、中序、后序)和查找
文章目录1、二叉树简介2、二叉树遍历(前序、中序、后序)3、二叉树查找指定结点4、代码实现1、二叉树简介树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。二叉树的子节点分为左节点和右节点。如果该二叉树的所有叶子节点都在最后一层,并且结点总数=2^n-1 , n为层数,则称为满二叉树。完全二叉树是由满二叉树而引出来的,若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数(即1~h-1层为一个满二叉树),第 h 层所有的结点都连续集中在最左原创 2022-02-16 11:23:00 · 446 阅读 · 0 评论 -
前缀、中缀、后缀表达式介绍(逆波兰计算器_代码实现)
文章目录1、前缀、中缀、后缀表达式1.1、前缀表达式(波兰表达式)2.2、中缀表达式2.3、后缀表达式(逆波兰表达式)2、逆波兰计算器3.1、中缀表达式转换为后缀表达式3.2、后缀表达式的计算机求值3.3、逆波兰计算机_代码实现1、前缀、中缀、后缀表达式1.1、前缀表达式(波兰表达式)前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前,举例说明:(3+4)×5-6对应的前缀表达式就是【-x+3456】前缀表达式的计算机求值从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算原创 2022-02-15 12:57:21 · 365 阅读 · 0 评论 -
栈(Stack)_分别使用数组和链表模拟栈_ java代码实现
1、栈的基本介绍栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈是一个先入后出(FILO-First ln Last Out)的有序列表。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反原创 2022-02-14 10:26:46 · 137 阅读 · 0 评论 -
数组模拟【队列】和【环形队列】_代码实现
1、队列基本介绍队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出2、数组模拟队列队列本身是有序列表,若使用数组的结构来存储队列的数据,则定义maxSize是该队列的最大容量。因为队列的输出、输入是分原创 2022-02-13 10:35:21 · 610 阅读 · 0 评论 -
哈希表(散列表_Hashtable)_数组+链表_代码实现员工管理
1、基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。2、实际需求有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,姓名,住址.),当输入该员工的id时,要求查找到该员工的所有信息.要求:不使用数据库,尽量节省内存,速度越快越好 => 哈希表(散列)添加时,保证按照id从低到原创 2022-02-12 10:08:57 · 1049 阅读 · 0 评论 -
约瑟夫(Josephus)问题_单向环形链表_代码实现
1、单向环形链表构建一个单向的环形链表思路先创建第一个节点,让first指向该节点,并形成环形后面当每创建一个新的节点,就把该节点,加入到已有的环形链表中即可.遍历环形链表先让一个辅助指针(变量)curChild,指向first节点然后通过一个while循环遍历该环形链表即可2、约瑟夫(Josephus)问题Josephus问题为:设编号为1,2,…n的n个人围坐一圈,约定编号为k (1<=k<=n)的人从1开始报数,数要到m的那个人出列,它的下一原创 2022-02-11 12:16:30 · 414 阅读 · 0 评论 -
单向链表实现学生信息管理
1、应用实例描述使用带head头的单向链表实现简易的班级学生信息管理代码框架描述测试方法定义结点类定义功能实现类实现管理班级学生信息的方法单链表的添加方式一:直接添加到单链表尾部方式二:按学号顺序添加到单链表单链表的遍历查询所有根据id查询单链表的删除单链表的修改求单链表中结点的个数查找单链表中的倒数第k个结点单链表的反转2、代码实现public class SingleLinkedListTest { public static原创 2022-02-11 09:01:25 · 578 阅读 · 0 评论