数据结构与算法
文章平均质量分 58
业火之理
这个作者很懒,什么都没留下…
展开
-
【javascript】商品种类算法
前言有小伙伴群里问了个面试题:有这样一个数据const a = [ { id: "17", caption: "颜色", types: ["黑", "棕"] }, { id: "23", caption: "材质", types: ["牛皮"] }, { id: "24", caption: "尺码", types: ["40", "41", "42"] },];需要让你返回这样的结果:[ { '17': '黑', '23': '牛皮', '24': '40' }, {原创 2020-08-27 11:20:30 · 548 阅读 · 1 评论 -
【leetcode】215、347最小堆做法
原理堆是个完全二叉树,js中一般可以使用数组来表示。最小堆顶部是最小元素,每次插入或者删除的时间复杂度是Olog(n),查找第k个最大元素O1(其实就是设置堆容量为k,最小那个就是第k个最大元素)。当堆容量超过k,删除堆顶,堆顶的替换需要下移。任意堆内元素找其父亲索引是其索引-1除以2的商。获取左侧子节点索引是 索引*2+1 ,右侧是 *2+2215代码215正常思路是排序,然后取索引k-1就行了,这里不说了。堆做法:class Minheap{ constructor()原创 2020-07-18 21:16:17 · 329 阅读 · 0 评论 -
【leetcode】113总结
原理无向图遍历主要原理是利用个map记录已访问过的节点,在遍历时进行判断,如果访问过就不递归。leetcode 133使用深度优先遍历:var cloneGraph = function(node) { if(!node)return[] let map = new Map() let dfs= function (node){ let clone = new Node(node.val) console.log(node.val);原创 2020-07-18 16:40:37 · 154 阅读 · 1 评论 -
【数据结构与算法】递归转栈
前言以前学数据结构学的很盲目,特别是后面学递归dp感觉脑子完全不够用,好像自己完全不是这块料一样。后来群里吹牛以及找各种资料发现能用递归的都可以用栈实现,递归本质是让系统帮你维护个栈,而你不递归,那么就自己手动维护栈,这样就能达到同样效果。简单例题leecode 144. 二叉树的前序遍历输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3]递归思路var preorderTraversal = function(ro原创 2020-07-03 05:39:04 · 837 阅读 · 1 评论 -
【leetcode】718 最长重复子数组(滑动窗口解法)
前言这是今日的每日一题,但是leetcode题解里对滑动窗口的解法动图之类有特别强烈的误导性,导致一般很难写出滑动窗口的解法。我自己研究之后,将他们错误的流程图改编成正确的流程便于以后有类似需求可以想到。原理这个滑动窗口的写法跟一般滑动窗口写法不太一样,一般滑动窗口只要移动指针就完事了,这个滑动窗口其实不应该看成滑动窗口,而应该去找规律。leetcode题解里面对这题虽然动图意思对的,但是顺序以及注意点都有强烈误导性,导致正常人看了动图压根写不出这种循环。所以我拿别人图将顺序和过程以及注意点改原创 2020-07-01 09:38:44 · 581 阅读 · 1 评论 -
【数据结构】顺序存储的循环队列
循环队列顺序存储的队列又被叫静态队列。如果队列不循环,会因不断出队入队,数据向后移动,产生假溢出现象。主要就是2个整形一个表示队首一个表示队尾。其他跟顺序存储一样。代码收获循环队列的头指针和尾指针相等既表示队列满,也表示队列空,所以做入队时判断加一余最大大小不能等于头指针。这样数据永远差一个元素满,就可以判断这个栈到底是空栈还是满栈了。循环队列打印也要注意需要进行取余的问题。#...原创 2018-10-21 17:16:19 · 1504 阅读 · 0 评论 -
【数据结构】队列的链式存储
队列的链式存储队列的链式存储和一般的链表思路不太一样。代码收获队列的链式存储是尾插入新节点,头删除节点!!这点和一般思路很不一样,需要注意。两个结构体初始化的时候别忘记2个都分配节点,并且要传指针地址,不然报空指针异常 exit code -1073741819错误。队列的出队需要注意要讨论出最后一个元素的情况。队列是有头节点的,并且front始终指向头节点而不是第一个元素!!出...原创 2018-10-27 19:45:16 · 238 阅读 · 0 评论 -
【数据结构】稀疏矩阵的二种转置方法
稀疏矩阵稀疏矩阵每个元素由3个元素组成,所以原数据1/3以下存储划算。矩阵的转置如果简单调换行和列,会使行优先变成列优先。代码收获稀疏矩阵里嵌套的结构体是数组形式,分配给总的那个结构体空间后不用另外给他分配空间。插入数据除了自己写方法外,还可以使用数组插入int a[]={1,2,4,5,6}然后使用循环把数据弄进去。快速定位就是算位置,最后调换过程直接想容易搞蒙,一步步写出中间...原创 2018-11-04 22:20:49 · 3316 阅读 · 0 评论 -
【数据结构】十字链表的建立
十字链表的建立十字链表是由代表行和列的指针数组指向每个表格里的节点。每个节点除了有行、列、数据信息外,还有指向同行下一个节点的指针,以及指向同列下一个节点的指针。代码收获定义结构体时候可以不先把指针数组给分配好,但是后面初始化需要给指针数组分配空间,空间为需要多少行或列的sizeof节点。其中难点在于新建一个节点后,需要把其按行和列插入表中。所以需要判断数组指针为空的时候,或者数组...原创 2018-11-12 23:10:52 · 2160 阅读 · 0 评论 -
【数据结构】广义表的同层链表结构
广义表的同层链表结构广义表除了同层链表结构还有头尾链表存储结构头尾链表存储结构较同层链表简单,容易求深度和长度。同层链表较头尾链表优势是占据空间较少。代码收获同层链表和头尾链表结构主要区别在于头尾链表是所有表节点连接,而同层链表因为共用体的原因,原子节点可以链接表节点。复习了枚举类型的写法,枚举类型结构体中间都是逗号。由于同层链表连接结构,用递归可以求出其物理上实际的深度,但是...原创 2018-11-19 00:32:46 · 655 阅读 · 0 评论 -
【数据结构】斐波那契数列的几种递归写法
斐波那契数列递归写法这个各种地方都有讲,主要是自己敲代码的收获。代码收获如果一个函数在函数内调用自己n次,一般是n叉数图像。复杂度参考二叉树。尾递归方法实质是把n叉数变成无分叉,计算结果出来后传给下一个函数,上一个函数关闭。思路跟迭代法,也就是消除递归的方法一模一样,但是迭代法效率最高。尾递归方法需要传递多个参数才能进行,一般需要传递递归函数的初始值,传递给下一个函数的计算结果值(...原创 2018-10-21 16:17:53 · 5338 阅读 · 0 评论 -
【数据结构】循环队列的应用(一)打印杨辉三角
打印杨辉三角杨辉三角是比较常见的应用,是下面一行的是上面2个数字的和,高中数学里牛顿二项式展开式应该有说。代码收获这题主要是找规律。利用下面一行比上面一行数字多一个,队列头为上一行,除了入队首尾的1之外,入队的上一行2个数的和等于新入队的元素,每入一次出一个上一行元素。分开讨论第3行以下和第3行及第三行后的。#include<stdio.h>#include<...原创 2018-10-28 17:38:28 · 3554 阅读 · 0 评论 -
【数据结构】线性表的链式存储(一)单链表
代码收获:循环链表一般新建一个指针跟着循环移动,如果需要插入或者删除操作,还需要新建个指针指向循环时候的前一个结点。getchar()最后敲的回车会卡进缓存里,需要继续用一次getchar()把回车给吃了。初始化如果不想返回指针的话使用二级指针,函数内等于一步分配空间的操作给二级的一级指针明确了地址指向。# include <stdio.h&g原创 2018-09-09 20:18:00 · 1079 阅读 · 0 评论 -
【数据结构】线性表的链式存储(二)循环链表
线性表链式存储的循环单链表循环链表从任意一点出发,可以访问全部节点。一般为了便于操作,将链表的头指针变为尾指针,指向尾节点,链表的头节点则为尾指针的next。代码收获用尾指针进行操作虽然省下循环,但是插入删除等操作都需要移动尾指针导致必须传入尾指针的地址进行操作。# include <stdio.h># include <stdlib.h&原创 2018-09-15 22:32:44 · 301 阅读 · 0 评论 -
【数据结构】线性表的链式存储(三)双向链表
双向链表的初始化插入与删除代码收获双向链表删除结点需要注意要删除最后一个结点和不是最后一个结点分类讨论。插入和删除时注意修改上一个结点里指向下一个结点的指针与下一个结点里指向上一个结点的指针。#include <stdio.h>#include &原创 2018-09-23 20:23:04 · 394 阅读 · 0 评论 -
【数据结构】线性表的链式存储(四)静态链表
静态链表的初始化插入删除操作代码收获静态链表有一个备用链表和数据两条链在一个空间里。比较特别的是需要对是否空链进行讨论,只有在空链时,-1游标对应的索引的数据是无效数据。用scanf记得后面要把回车吃掉。插入和删除需要考虑备用链表的操作。一般需要知道另一个变量操作位置的前一个数据的索引。线性表归档线性表顺序存储线性表链式存储一——单链表线性表链式存储二——循环链表线性表链式...原创 2018-09-24 18:19:03 · 304 阅读 · 0 评论 -
【数据结构】栈的存储结构(一)顺序栈
顺序栈栈分为顺序栈和链栈。顺序栈用数组存数据,整型指向栈顶。特点就是先入先出原则。栈在逻辑上是线性结构。代码收获出栈需要个元素获取出栈的数据,实际并没有把此数据从栈顶拿走。操作上采用传地址的方式把出栈的值传给*地址。初始化思路跟线性表顺序存储一样。# include <stdio.h># include <stdlib.h>//栈有2种存储结构...原创 2018-10-03 09:48:44 · 2741 阅读 · 0 评论 -
【数据结构】栈的存储结构(二)双端栈
双端栈双端栈是为了更有效的利用栈的空间而产生的。双端栈是一种特殊的顺序栈。双端栈适用于一组互补的数据。双端栈两端为底,2个整形表示栈顶指针。代码收获主要还是弄清双端栈的结构。#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100//双端栈需要有2个栈顶指针 底在2端typ原创 2018-10-05 19:11:15 · 1084 阅读 · 0 评论 -
【数据结构】栈的存储结构(三)链栈
链栈链栈因为不是数组存储,所以需要有指向下一个结点的指针 。链栈如果使用头插法是不需要栈顶指针,即栈顶指针就是头指针。操作和头插法链表一样。链栈若用尾插法略麻烦。代码收获主要了解链栈的数据结构。链栈的结构体中存储链接下一个结构体的指针,而顺序栈是使用的整形变量作为头指针。链栈的结构体中若是用头插法则不需要栈顶指针,栈顶指针即头指针。# include <stdio.h...原创 2018-10-06 11:54:03 · 1088 阅读 · 0 评论 -
【数据结构】栈的运用(一)无括号表达式求值
无符号表达式求值- 利用栈的特性进行表达式计算。- 主要思路是做一个数字栈和一个符号栈,分别存放数字和运算符。- 利用入栈的运算符和栈内运算符相比较优先级达到计算目的。原创 2018-10-07 13:21:01 · 2022 阅读 · 0 评论 -
【数据结构】栈的运用(二)无括号表达式求值修正版
无括号表达式修正博主换了clion之后发现自己前面写的代码有很多遗漏的地方,以修正无括号表达式求值那篇提高自己水平。前面无括号表达式求值是不能求大于1位数的运算的,我对代码进行了修改让其可以求大于2位数的运算同时完善了许多语句和逻辑。代码收获clion有时候会提示xxx can be pointer to const,意思是你下面那段代码并没有修改xxx指针指向的值,建议你直接传值或...原创 2018-10-14 17:28:02 · 909 阅读 · 2 评论 -
【数据结构】线性表的顺序存储
这段时间准备将书上的数据结构全部自己实践一遍。 线性表是有序和有限的,分顺序存储和链式存储。 本篇记录c语言实现顺序存储代码。# include <stdlib.h># include <stdio.h># define MAXSIZE 100# define ELEMENT inttypedef struct{ E原创 2018-09-02 19:32:39 · 374 阅读 · 0 评论