
算法
文章平均质量分 60
会写代码的花城
大家好,我是花城、没错就是那个花城,同时我是一个正在努力靠近目标的程序员,参与了dromara社区开源项目赫兹跳动,希望大家多多支持呀,也希望自己的博客能让我们大家一起向着各自的目标靠近
展开
-
动态规划题目-------蓝桥杯真题-------蓝桥杯备战
数字三角形上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。输入描述输入的第一行包含一个整数 N(1≤N≤100),表示三角形的行数。下面的 NN 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。输出描述输出一个整数,表示答案。输入输出样例示例原创 2021-03-07 12:29:47 · 1072 阅读 · 0 评论 -
KMP算法------字符串匹配问题
KMP算法应用场景——字符串匹配问题有一个字符串str1 = “河南河南软件河南大学河南科技大学软件学院”和str2=“河南科技大学”现在要判断str1是否含有str2,如果存在,就返回第一次出现的位置,如果没有,则返回-1这是很多字符串匹配问题的例子我们首先会想到的是暴力匹配如果用暴力匹配的思路,并假设现在str1匹配到i位置,子串str2匹配到j位置,则有:1.如果当前字符匹配成功( 即str1[i] == str2[j]),则i++, j++, 继续匹配下一个字符2.如果失配(即s原创 2021-02-20 17:54:07 · 130 阅读 · 0 评论 -
动态规划算法-----入门
动态规划案例 —— 背包问题有一个背包,容量为4磅,现有如下物品物品重量价格吉他G11500音响S43000电脑L32000要求达到的目标为装入的背包的总价值最大,并且重量不超出要求装入的物品不能重复动态规划介绍动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问原创 2021-02-19 17:56:20 · 4609 阅读 · 2 评论 -
分治算法入门
分治算法韩顺平数据结构算法与笔记介绍把一个复杂的问题分解成两个或者多个相同或相似的小问题,再把小问题划分成更小的问题分治算法可以求解的一些经典问题二分搜索大整数乘法棋盘覆盖合并排序快速排序线性时间选择最接近点对问题循环赛日程表汉诺塔难点:怎么把大问题划分成小问题基本步骤1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题2)解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题3)合并:将各个子问题的解合并为原问题的解。设计模原创 2021-02-19 17:52:27 · 142 阅读 · 0 评论 -
二分查找-----非递归方式
二分查找算法(非递归方式)首先我们要清楚使用我们的二分查找算法的前提条件:二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找二分查找的思路二分查找会用到递归的思想,当然也有非递归的方式,我是分开来学习了1.首先确定数组的中间下标mid mid = (left+ right)/22.让需要查找的数findValue和我们的arr[mid]比较 如果findValue>arr[mid],往右边递归找 如果findValue<arr[mid原创 2021-02-19 17:51:04 · 568 阅读 · 0 评论 -
数据结构------图-----深度广度优先遍历
图为什么要用到图线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时,这里我们就用到了图也就是说图可以代表多对多之间的关系图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。结点也可以称为顶点。常用概念1.顶点 就是我们的节点2.边 我们相邻节点的连线3.路径 节点之间有多少种方式连接4.无向图5.有向图 边有方向6.带权图 带值的图表示方式1.二维数组表示法 邻原创 2021-02-19 10:35:43 · 305 阅读 · 0 评论 -
数据结构-----平衡二叉树
平衡二叉树有些情况下我们的二叉排序树更像单链表,什么情况呢?如果有一个数列为1,2,3,4,5,6,那么他的二叉排序树是不是就不怎么好看了虽然不怎么影响添加删除的速度,但是可能会影响我们的查询速度的存在的问题左子树全部为空,从形式.上看,更像一个单链表.插入速度没有影响,查询速度明显降低(因为需要依次比较),不能发挥BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢基本介绍平衡二叉树也叫平衡二叉搜索树(Self- balancing binary search tree)原创 2021-02-17 17:26:13 · 273 阅读 · 0 评论 -
数据结构--------二叉排序树
二叉排序树先看一个需求给你一个数列(7,3, 10, 12,5,1,9),要求能够高效的完成对数据的查询和添加。方案我们一般首先会想到数组的方式数组未排序,优点:直接在数组尾添加,速度快。缺点:查找速度慢.数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。链式存储呢?不管链表是否有序,查找速度都慢,添加数据速度比数组快,不需要数据整体移动。我们前面说到树存储可以有效解决,到底是为什么呢?二叉排序树介绍原创 2021-02-16 15:55:35 · 141 阅读 · 0 评论 -
数据结构-------赫夫曼树
赫夫曼树基本介绍给定n个权值作为n个叶子结点,构造一棵二叉树, 若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(HuffmanTree),还有的书翻译为霍夫曼树。也就是说:赫夫曼树是带权路径长度最短的树,权值较大的节点离根较近一些概念路径和路径长度 : 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1结点的权及带权路径长度:若将树中结点原创 2021-02-16 15:54:20 · 376 阅读 · 0 评论 -
排序算法----------堆排序
堆排序介绍堆排序也是一种选择排序,最坏最好平均时间复杂度均为O(nlogn),它属于不稳定排序是一个完全二叉树,每个节点的值都大于或等于其左右孩子节点的值===>大顶推,注意他并没有要求左右孩子节点值的大小关系,反之就是小顶堆基本思想1.将待排序序列构造成一个大顶堆此时,整个序列的最大值就是堆项的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆, 这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。图解教学视频中原创 2021-02-16 11:06:16 · 202 阅读 · 0 评论 -
线索化二叉树的创建与遍历
线索化二叉树先看一个问题来理解什么是线索化二叉树有一个数列存的是科大学生的面试成绩{1,3,6,8,10,14},将他构建成一颗二叉树我们发现就是一个完全二叉树问题是什么?当我们对上面的二叉树进行中序遍历时,数列为{8,3, 10,1,14,6}但是6, 8, 10,14这几个节点的左右指针,并没有完全的利用上.如果我们希望充分的利用各个节点的左右指针,让各个节点可以指向自己的前后节点怎么办?基本介绍1.n个结点的二叉链表中含有n+1公式2n-(n-1)=n+1个空指针域。利用二叉链表中原创 2021-01-27 20:11:04 · 297 阅读 · 0 评论 -
顺序存储二叉树
顺序存储二叉树基本说明从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,数组arr = 1,2,3,4,5,6,7顺序存储二叉树为[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-prIdHKxU-1611749301899)(C:\Users\王庆华\AppData\Roaming\Typora\typora-user-images\image-20210127135432644.png)]特点1.顺序存储二叉树通原创 2021-01-27 20:09:02 · 220 阅读 · 0 评论 -
树的查找和删除节点
查找指定节点使用我们的前中后序遍历找到一个指定节点,查找HeroNode = 4 分别查找了几次?例子还是我们上面讲到的那个二叉树,我们先分析前序查找:先判断当前的no是不是要查找的,是就返回当前节点,不是的话,判断当前节点的左子节点是否为空,若不为空则递归前序查找,找到返回,为空(或者没有找到)的话就去判断右子树,跟我们的左子节点一样emmmm,其他两种都已一样的套路,这里就不多说了前序遍历:小王——>小胡——>小黄——>老肥找到中序遍历:小胡——>小王——>.原创 2021-01-26 14:08:36 · 456 阅读 · 0 评论 -
树以及树简单的遍历方法
树因为是跟着视频学的所以这个地方也就分为两个部分了基础部分为什么需要树这种数据结构1.先说数组存储的方式吧,我们都知道,数组有很多排序算法,也有常见的查找算法,这使我们操作起来很方便,但是呢,我们发现其实这种方便也仅仅是在于查找,排序那种简单类型的,遇到对象类型的就比较麻烦,而且插入的时候会整体移动,效率比较低。2.链式存储方式,在一定程度上对数组的存储方式进行了改善,比如插入某个值,我们只需要将插入的节点连接到表中即可,删除的效率也很高,但是他的查询检索效率对应的就低下来了,比如检索某个值,原创 2021-01-25 23:02:28 · 263 阅读 · 0 评论 -
数据结构--数组+链表实现哈希表
哈希表哈希表是一种数据结构不同于往常的数据结构的是,往常的数据结构我们存储的数据比较单一,存储的标识比较简单,不能像数据库中的一条信息一样包含多个属性,为此,哈希表就可以简单实现这些要求基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希表的结构数据不一定跟我们下面的例子有关,这里我是再网上找了一原创 2021-01-23 22:37:52 · 1020 阅读 · 0 评论 -
查找算法---------斐波那契查找
斐波那契查找又称黄金分割法,有兴趣的可以了解一下黄金分割点是什么那黄金分割跟斐波那契数列有什么关系呢?斐波那契数列:1,1,2,3,5,8,13,21,34,55发现两个相邻数的比例,无限接近黄金分割值的0.618原理斐波那契查找原理与前两种相似,仅仅改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近,即mid=low+F(k-1)-1(F代表斐波那契数列),如下图所示[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dDgUzGo原创 2021-01-22 22:48:54 · 157 阅读 · 0 评论 -
查找算法-------插值查找
插值查找那我们发现我们上个查找方法,二分查找如果查找一些数字会变麻烦,举个简单的例子,我们有1,2,3,4,5,6,7我们查找1会发现我们会查找3次,有点不理想,那么我们是否有更高效的方法呢?原理1.插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。2.将折半查找中的求mid索引的公式,low表示左边索引,high表示右边索引.key就是我们要查找的值findValue3.int midlIndex = low + (high - low) * (key - arr原创 2021-01-19 21:35:39 · 184 阅读 · 0 评论 -
查找算法---二分查找(递归方式)
二分查找前提条件我们的二分查找必须是在有序数组中查找无论是从小到大还是从大到小题目请对一个有序数组进行二分查找{1, 8,10,89,1000,1234},输入一个数看看该数组是否在此数,姐出下标,如果没有就提示没有这个数”。思路我们这次的二分查找会用到递归的思想,当然也有非递归的方式,我是分开来学习了1.首先确定数组的中间下标mid mid = (left+ right)/22.让需要查找的数findValue和我们的arr[mid]比较 如果findValue&g原创 2021-01-19 16:55:15 · 3285 阅读 · 0 评论 -
查找算法------顺序查找
查找算法顺序查找又叫线性查找我们来看一个题目科大有学生成绩分布如下:1,8,10,89,1000,1234要求:判断数列是否包含某个特定的值(这里我就不举例)直接在题目中展示找到了就返回值以及下标代码//顺序查找算法//@author 王public class SeqSearch { public static void main(String[] args) { // TODO Auto-generated method stub int arr[] = {1,9,11原创 2021-01-19 16:53:39 · 148 阅读 · 0 评论 -
算法笔记-------基数排序
基数排序介绍1)基数排序(radixsort) 属于“分配式排序”( distributionsort),又称**“桶子法**”(bucket sort)或binsort, 顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法3)基数排序(RadiXSort)是桶排序的扩展4)基数排序是1887年赫尔曼何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。图解原创 2021-01-14 17:01:42 · 184 阅读 · 0 评论 -
算法笔记-----归并排序
归并排序介绍归并排序(MERGE SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide- and- conquer)策略(分治法将问题分(divide) 成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。也就是该算法的核心思想是分治思想动态图解我们发现我们的分并没有做什么其他的功能,只是将我们的数组拆分开来为我们下面的治提供条件我们再来看看他的复杂度,我们是8个数据,但是合并总共是7次所以说他的复杂原创 2021-01-14 17:00:59 · 202 阅读 · 1 评论 -
算法笔记-------快速排序
快速排序介绍快速排序(Quicksort) 是对冒泡排序的一种改进基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列拿老师的例子来说:-9,78,0,23,-567,70,这几个数据从小到大排序快排是什么意思呢,我们取一个值(可以更换)0,我们把比0小的放到左边,比0大的放到右边,注意:这个地方比0小的也就是左边不一定有序,右边也不一定原创 2021-01-14 17:00:14 · 135 阅读 · 0 评论 -
数据结构与算法-------希尔排序------交换法+移动法
希尔排序希尔排序是希尔(DonaldShell) 于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。基本思想希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止解释我们看常见的希尔排序动态图解太快额?来个静态图示已经非常接近有序的了,即使需要移动来插入,也就移动1到2步,我们就可以使用直接插入排序原创 2020-12-24 21:40:38 · 416 阅读 · 0 评论 -
数据结构与算法------插入排序
插入排序插入式排序属于内部排序法,对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。排序思想把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的.适当位置,使之成为新的有序表。图解[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bJtRKn2R-1608799304807)(https原创 2020-12-24 16:51:46 · 145 阅读 · 1 评论 -
数据结构与算法笔记-------选择排序
选择排序基本介绍选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。排序思想选择排序(select sorting) 也是一种简单的排序方法。它的基本思想是:第一次:从一个array数组中找到最小值与array[0]交换,也就是说不是像冒泡那样找到小的就交换,而是遍历了数组,找到最小的和array[0]交换,一次只发生一次交换第二次:从array数组的array[1]~~~array[n-1]中找到最小值,与array[1]交换,这原创 2020-12-21 22:38:54 · 210 阅读 · 1 评论 -
排序算法基础+冒泡排序+冒泡排序的小优化
排序算法排序的分类:1)内部排序:指将需要处理的所有数据都加载到内部存储器**(内存)**中进行排序。2)外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。时间复杂度事后统计的方法这种方法可行,但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,这种方式,要在同一台计算机的相同状态下运行,才能比较那个算法速度更快。事前估算的方法通过分析某个算法的时间复杂度来判断哪个算法更优.时原创 2020-12-20 22:23:42 · 274 阅读 · 0 评论 -
递归算法应用实例------八皇后算法
八皇后问题回溯算法的经典案例回溯算法的典型案例。该问题是国际西洋棋棋手马克斯.贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能外干同一行、同一列或同一斜线上,问有多少种摆法。思路分析第一个皇后先放在第一行第一列第二个皇后放在第二行第一列、然后判断是否0K,如果不OK, 继续放在第二列、第三列、依次把所有列都放完,找到一个合适继续第三个皇后,还晕第一列、第二列…直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解当得到一个正确解时原创 2020-12-20 20:32:02 · 293 阅读 · 2 评论 -
数据结构------递归+迷宫问题+最短路径问题解决思路
递归场景以及概念迷宫回溯问题简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。调用机制1.打印问题package com.wang.Recursion;/** * @author 王庆华 * @version 1.0 * @date 2020/12/20 9:30 * @Description TODO * @pojectname 递归代码 */public class RecursionTest {原创 2020-12-20 11:13:08 · 2065 阅读 · 6 评论 -
前缀、中缀、后缀表达式以及逆波兰计算器
前缀、中缀、后缀表达式前缀表达式 波兰表达式前缀表达式的运算符位于操作数之前就比如(3+4)x5-6对应的前缀表达式就是 - X + 3 4 5 6前缀表达式在计算机中的计算机求值从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈项元素和次项元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果例如: (3+4)X5-6对应的前缀表达式就是 一 X +3456针对前缀表达式求值步骤如下:1)从右原创 2020-12-19 19:58:45 · 2365 阅读 · 1 评论 -
数据结构-----栈+中缀表达式(计算器)
栈问题引入一个计算器的简单实现,计算机怎么理解算式的,对于计算机而言,他接受到的就是一个字符串,而且不是两个数之间,而是一串算式计算你就得考虑拆分数字和运算符,你还得考虑计算优先级等等引出栈的介绍什么是栈1)栈的英文为(stack)2)栈是一个先入后出(FILO-First In Last Out)的有序列表。3)栈(stack)是 限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端, 称为原创 2020-12-18 22:51:03 · 411 阅读 · 1 评论 -
数据结构-----环形链表
单向环形链表约瑟夫问题Josephu问题为:设编号为1, 2, …n的n个人围坐一圈,约定编号为k (1<=k<=n) 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生- -个出队编号的序列。n = 5即有五个人k=1,从第一个人开始m=2,数两下出队列的顺序是 2——4—–1—–5——-3思路1.先创建第一个节点,让我们的first指向该节点,并形成环形2.后面当我们创建一个新的节点,就把该原创 2020-12-10 14:24:45 · 284 阅读 · 0 评论 -
数据结构-----双向链表笔记
双向链表对比**1)**单向链表,查找的方向只能是一一个方向,而双向链表可以向前或者向后查找。**2)**单向链表不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到temp的前一个节点来删除的我们的双向链表增加了一个节点:pre 指向前一个节点,加上我们的next,指向下一个节点,就是双向的了遍历像单链表一样,只不过能可以向前,也可以向后添加先找到双向链表的最后这个节点temp.next = newHeroNode;newHeroNode.原创 2020-12-10 14:22:57 · 137 阅读 · 0 评论 -
数据结构--------单链表+面试题
单链表特点以节点的形式存储,链式存储每个节点包含data(数据),next(下一个节点的地址)链表不一定是连续存储链表分带头结点的链表和没有头结点的链表内存结构地址datanext110a2180120130a4170140a6NULL150a1110160170a5140180a3130特点就是我们的a1的next指向我们a2的地址,依次排列但是我们的内存顺序不一定是连续的!!原创 2020-12-10 14:21:31 · 159 阅读 · 0 评论 -
数据结构-----队列笔记
队列有序列表,可以用数组或者链表来实现特点:先进先出eg:银行排号数组模拟队列算法代码实现public class ArrayQueueDemo { public static void main(String[] args) { //创建 ArrayQueue arrayQueue = new ArrayQueue(3); char key =' '; Scanner scanner = new Scanner原创 2020-12-10 14:19:32 · 100 阅读 · 0 评论 -
算法案例之有效字母异位词
本题参考力扣题解写的理解思路,原文请参照力扣官网242题https://leetcode-cn.com/problems/valid-anagram/题目:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:输入: s = “anagram”, t = “nagaram”输出: true示例 2:输入: s = “rat”, t = “car”输出: false说明:你可以假设字符串只包含小写字母。进阶:如果输入字符串包含 unicode 字符原创 2020-11-22 19:53:51 · 167 阅读 · 2 评论 -
数据结构与算法笔记一:稀疏数组的应用
稀疏数组情景:也就是说稀疏数组存储的数据都有特殊意义、情景:当一个数组中大部分元素为0 的时候,或者为同一个值的数组时,可以使用稀疏数组来保存该数组处理方法记录数组一共几行几列,有多少个不同的值把具有不同值的元素的行列以及值记录在一个小规模的数组中,缩小程序的规模稀疏数组:rowcolvalue0原数组总行数原数组总列数有效值个数1第一个有效值所在行数第一个有效值所在列数有效值是多少2第二个有效值所在行数第二个有效值所在列数原创 2020-11-20 21:47:07 · 166 阅读 · 0 评论 -
Java数值溢出问题以及简单的算法实例
一.什么叫数据溢出数据溢出就是:当某一种类型的数值已经达到了此类型能够达到的最大值之后,再继续扩大,或者达到了最小值后再继续缩小,就会出现数据溢出问题。在Java中的基本类型都有一个范围,超出这个范围就会数值溢出就拿Int来举例int 类型在 Java 中是“有符号”的。所谓“有符号”就是有正负。首位代表我们的数值正负首位如果是 0,就是正的,1 就是负的。正与负的区别也因此就在于取反加一。Java 中的 int 总共就 32 位,正数上限的情况首位也只能是 0,其他位都可以是 1(就是 2原创 2020-11-18 20:08:46 · 2573 阅读 · 0 评论