随笔分类 -  数据结构与算法

摘要:1.经典题,题目就不上了,上个图吧,注意数组至少有两个值 2.暴力破解法 直接算时间复杂度O(n^2),提交能够直接AC,但是时间消耗极大,只打败了7%的提交者 class Solution { public int maxArea(int[] height) { int len = height. 阅读全文
posted @ 2020-08-07 18:14 LeftBody 阅读(156) 评论(0) 推荐(0)
摘要:1.问题不再描述 实现A.indexOf(B) 2.思路 两个字符串各设置一个指针,进行匹配,下面将A称为母串,B称为子串,指针分别称为母指针和子指针。 两个指针指向的字符如果相同的话,判断是否是匹配状态,如果两个字符串是第一次匹配,就记录下当前位置,并继续向后匹配。 因此,我们需要判断当前是否在匹 阅读全文
posted @ 2020-08-07 16:47 LeftBody 阅读(263) 评论(0) 推荐(0)
摘要:题目: 单链表的逆转 有解题思路代码很好写,下面的图是C语言的的,但是一看就可以明白。来源:https://www.jianshu.com/p/4664af99b597 代码: class Solution { public ListNode reverseList(ListNode head) { 阅读全文
posted @ 2020-06-09 17:59 LeftBody 阅读(171) 评论(0) 推荐(0)
摘要:一、简介 迪杰斯特拉(Dijkstra)算法和弗洛伊德(Flyod)算法均是用于求解有向图或无向图从一点到另外一个点最短路径。 二、Dijkstra 迪杰斯特拉算法也是图论中的明星算法,主要是其采用的动态规划思想,使其在数据结构、算法、离散数学乃至运筹学中都扮演重要的角色。以下图为例: 以A为起点, 阅读全文
posted @ 2019-12-04 23:59 LeftBody 阅读(12647) 评论(0) 推荐(0)
摘要:归并排序的基本思想是指递归的将待排序数组分为两组,直到无法再分,停止条件中间数m等于左边界或者右边界。如下图所示: 分完之后进行合并,如果两个合并的部分均只有1个元素,那么直接进行比较后交换即可。 如果每个部分拥有多个数据,则进行合并。以{4,6}和{8}合并为例: 先申请一个等长的数组,第一轮各有 阅读全文
posted @ 2019-11-24 23:33 LeftBody 阅读(216) 评论(0) 推荐(0)
摘要:堆排序就是借助二叉堆进行排序,不了解二叉堆的可以先看这里。本文以升序排序为例,首先将待排序数组放置在最小堆中,此时堆顶一定是数组中最小的元素,然后删除堆顶元素,此时调整后的最小堆顶会是第二小的元素,从而实现排序。 时间复杂度:O(nlogn) 代码: public static void main( 阅读全文
posted @ 2019-11-24 23:30 LeftBody 阅读(260) 评论(0) 推荐(0)
摘要:快排——排序中的明星算法,也几乎是必须掌握的算法,这次我们来领略以下快排为何魅力如此之大。 快排主要有两种思路,分别是挖坑法和交换法,这里我们以挖坑法为例来进行介绍,交换法可以参考这篇博文。值得一提的是,这篇博文下面有许多批评的声音,质疑为何需要交换,其实是不了解快排具有两种形式,而作者采用了较为不 阅读全文
posted @ 2019-11-21 00:16 LeftBody 阅读(265) 评论(0) 推荐(0)
摘要:概述:听到希尔排序这个名称,心里完全没有任何概念,因为这个名称不能给你提供任何有效的信息。但是它的名字又是那么的特殊,以至于学习过数据结构排序的都知道这种方法的存在。现在我们就来看一下所谓的希尔排序。 希尔排序是一种先进排序的算法,先进排序算法是指时间复杂度比简单排序更进一步的排序算法,除希尔排序之 阅读全文
posted @ 2019-11-19 22:14 LeftBody 阅读(142) 评论(0) 推荐(0)
摘要:基本思想:简单排序的一种。如果玩过扑克牌应该都知道顺子,这时有一把顺子但是顺序是乱的,你要去按顺序整理。那第二张牌和第一张牌比较,调整顺序后前两张牌就是有序的,接着第三张牌插入前两张的有序列中,形成三张牌的有序序列。以此类推,最后能够获得一个按顺序排列的顺子。 算法复杂度:O(n^2) 代码: pu 阅读全文
posted @ 2019-11-19 13:12 LeftBody 阅读(140) 评论(0) 推荐(0)
摘要:基本思想:和冒泡排序、直接插入排序并称为三大简单排序算法。显然,说明它们都很简单😀。 第一次选择出数组最小的数据的下标,然后通过和首位元素的交换将其放在数组首位。然后第二次循环从数组的第二位开始寻找数组中最小元素的下标,同样和第二个元素交换位置,依次类推,一直到确定倒数第二位元素,这样数组的排序就 阅读全文
posted @ 2019-11-19 00:25 LeftBody 阅读(178) 评论(0) 推荐(0)
摘要:基本原理:对于冒泡排序来说,基本思想是从第一个元素开始,数组中的数据依次和它后面相邻的数据进行比较,即1和2比较,2和3比较,a和a+1比较,直到倒数第二位和倒数第一位的比较,如果顺序不对就进行交换,这样一次下来最大的元素会被放置在最后的位置上【以升序为例,这里是理解冒泡排序的重点。】接着,在进行一 阅读全文
posted @ 2019-11-19 00:17 LeftBody 阅读(191) 评论(0) 推荐(0)
摘要:一、Prim算法 普利姆(Prim)算法适用于求解无向图中的最小生成树(Minimum Cost Spanning Tree)。下面是Prim算法构造最小生成树的过程图解。 选择一个节点开始,比如V1进入集合U,剩下的集合的V-U包括剩下的节点,然后寻找从集合U到集合V-U最近的路径。这里有三条路径 阅读全文
posted @ 2019-11-18 00:00 LeftBody 阅读(6119) 评论(0) 推荐(0)
摘要:1.有向无环图和拓扑排序 有向无环图(Directed Acyclic Graph,简称DAG);拓扑排序指的对DAG一个有序的线性排列。即每次选出一个没有入度的节点,然后输出该点并将节点和其相关连的弧都删除(此时均为以该节点为弧头的弧),依次进行,直至遍历所有节点,就是一个DAG的拓扑排序,值得一 阅读全文
posted @ 2019-11-13 23:12 LeftBody 阅读(2155) 评论(0) 推荐(1)
摘要:1.图的两种遍历方式 图的遍历通常有两种方式,即深度优先搜索(Depth First Search)和广度优先搜索(Breadth First Search)。前者类似于树的先序遍历,而后者类似于树的层次遍历。 2.深搜的实现 从节点A开始,找到第一个邻接点B,接着按照深搜的策略,寻找B的第一个邻接 阅读全文
posted @ 2019-11-12 00:17 LeftBody 阅读(178) 评论(0) 推荐(0)
摘要:1.无向图邻接矩阵 以上是一个无向图的邻接矩阵,矩阵七个维度的顺序分别是A,B,C,F,L,J,M,假设矩阵第一行第二列为1代表节点A和节点B有连线,显然邻接矩阵此时应为对称矩阵,且对角线元素均为0。若是有权网络,那么矩阵的元素由1变为权重即可无连接则用无穷大Inf代表,实际操作可用65536等较大 阅读全文
posted @ 2019-11-11 14:33 LeftBody 阅读(578) 评论(0) 推荐(0)
摘要:1.图的定义 图中的数据元素称为点(Vertex),连接这些顶点的线称为边(Edge)或者弧(Arc),前者是在无向图(Undigraph)中的名称,而后者是有向图(Digraph)中的术语,指向的点称为弧尾,而发出的点称为弧头。 完全图(Completed graph)是指所有点之间都有连边的无向 阅读全文
posted @ 2019-11-10 14:45 LeftBody 阅读(493) 评论(0) 推荐(0)
摘要:看到这个题目首先想到是排序,那么时间复杂度自然就是O(NlgN)。那么使用二叉堆如何解决呢? 对于下面一个数组,共有12个元素,我们的目标就是找出第5大元素——12 首先建立一个具有M个元素的最小堆,那么堆顶是这M个元素的最小值,接下来遍历剩下的元素,如果一个元素小于堆顶元素则不做任何操作,如果大于 阅读全文
posted @ 2019-11-09 22:19 LeftBody 阅读(378) 评论(0) 推荐(0)
摘要:博客园博主skywang123456(以下简称s博主)是一个大牛级的人物,相信很多程序员都拜读过他的博客,我也不例外,并且受益匪浅。但是对于文章二叉堆(三)之 Java的实现我有一些疑惑,写在这里,供有缘人参考。对于而二叉堆的插入,是一个较为简单的方法,这里没有什么问题。但是而二叉堆的删除确是一个稍 阅读全文
posted @ 2019-11-09 19:28 LeftBody 阅读(604) 评论(0) 推荐(0)
摘要:一、堆和二叉堆 堆,英文名称Heap,所谓二叉堆(也有直接称二叉堆为堆的),本质上是一个完全二叉树,前面也提到过,如果树接近于完全二叉树或者满二叉树,采用顺序存储代价会小一点,因此常见的二叉堆均是顺序实现的。 按照排列的顺序可以分为最大堆和最小堆,最大堆的特征是父节点一定大于(依据情况判断是大于等于 阅读全文
posted @ 2019-11-06 18:51 LeftBody 阅读(1219) 评论(0) 推荐(0)
摘要:一、AVL树 AVL树是一种自平衡二叉查找树,因此在了解AVL树之前先介绍一下平衡二叉树。所谓平衡二叉树即该树中的任一个节点的左子树和右子树高度差不会超过1。如下图左是平衡二叉树,而右图则不是。节点40的左子树高度为1,而右子树高度为3,这样就相差了2,所以不是一个平衡二叉树,平衡树其实并不注重节点 阅读全文
posted @ 2019-10-31 23:29 LeftBody 阅读(421) 评论(0) 推荐(0)