数据结构与算法
aliven1
前端工程师,技术栈:PS、AI、H5、CSS3、JS、TS、jQuery、vue、react、微信小程序、node、express、svn、git、webpack
展开
-
冒泡排序和二分查找--go
【代码】冒泡排序和二分查找--go。原创 2024-10-27 14:44:21 · 349 阅读 · 0 评论 -
图:广度优先遍历(BFS)和深度优先遍历(DFS)
【代码】图:广度度优先遍历(BFS)和深度优先遍历(DFS)原创 2024-05-05 15:56:42 · 323 阅读 · 1 评论 -
用最少数量的箭引爆气球
在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。弓箭一旦被射出之后,可以无限地前进。原创 2024-04-23 11:00:58 · 300 阅读 · 0 评论 -
跳跃游戏-贪心算法
如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。你的目标是使用最少的跳跃次数到达数组的最后一个位置。给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。转载 2024-04-17 14:57:27 · 46 阅读 · 0 评论 -
买卖股票的最佳时机-贪心算法
给定一个数组: [7,1,5,3,6,4],它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票。想获得利润至少要两天为一个交易单元。当前只有买股票或者卖股票的操作。转载 2024-04-16 14:35:49 · 49 阅读 · 0 评论 -
回溯组合求和算法---去重
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明: 所有数字(包括目标数)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,所求解集为:解题重点:集合(数组candidates)有重复元素,但还不能有重复的组合。原创 2024-03-26 11:26:58 · 327 阅读 · 0 评论 -
回溯算法模板框架
【代码】回溯算法模板框架。原创 2024-03-11 16:00:13 · 415 阅读 · 0 评论 -
删除字符串中相邻重复项
【代码】删除字符串中相邻重复项。原创 2023-06-12 17:13:06 · 178 阅读 · 0 评论 -
栈和队列-有效的括号
【代码】栈和队列-有效的括号。原创 2023-06-12 17:12:55 · 116 阅读 · 0 评论 -
利用哈希表,判断是否为异位词
【代码】利用哈希表,判断是否为异位词。原创 2023-05-31 14:57:02 · 319 阅读 · 0 评论 -
环形链表-环形链表判断
可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。这是因为fast是走两步,slow是走一步,其实相对于slow来说,fast是一个节点一个节点的靠近slow的,所以fast一定可以和slow重合。首先第一点:fast指针一定先进入环中,如果fast指针和slow指针相遇的话,一定是在环中相遇,这是毋庸置疑的。转载 2023-05-30 17:40:21 · 109 阅读 · 0 评论 -
基于js数组封装队列-击鼓传花
队列,击鼓传花原创 2023-05-28 17:49:08 · 121 阅读 · 0 评论 -
链表反转-双指针和递归
【代码】链表反转-双指针和递归。原创 2023-05-13 18:23:01 · 96 阅读 · 0 评论 -
单向链表创建
重点:创建虚拟头节点。原创 2023-05-13 16:27:50 · 80 阅读 · 0 评论 -
螺旋矩阵-数字矩阵
然后做一下思考,一个边长为n的正方形矩阵,每次转完外圈,螺旋向内收缩时,边长收缩为n1=n-2;挡转完这个圈,再向内时,边长再度收缩为n2=n1-2;也就是n这个数包含几个2,就需要转几圈。也就是和n/2有关。当n为奇数,需要转的完整圈数也是n/2,但是最后肯定回缩圈到一个3x3的矩阵,最后一个数字放在最中央。但是严格来说应该是(n/2)+1圈,最后一圈缩到一个1x1的矩阵。当n为偶数,这个圈数就是n/2;画一下边长为2~5的情况。n就是题目给出的正整数。原创 2023-05-08 17:35:12 · 538 阅读 · 0 评论 -
数据结构优化-数据与描述分离
表单数据结构的优化使用如下的结构的优势重置数据更简单,eg:formData=JSON.parse(JSON.stringify(originData)) ;数据维护更简单直观接口间组织传递数据,更方便易用data:{ formData:{ name:'', age:1, female:true }, rules:{ name:{ label:'姓名', pattern://i, fixed:false }, age:{ la原创 2022-01-17 11:30:07 · 508 阅读 · 0 评论 -
排序算法 javascript
function ArrayList(){ this.array=[]; ArrayList.prototype.insert=function(item){ this.array.push(item) }; ArrayList.prototype.toString=function(){ return this.array.join('-') }; ArrayList.prototype.swap=function(m,n){ // 交换两个位置的数据 v.原创 2021-06-05 11:45:23 · 119 阅读 · 1 评论 -
数据结构与算法——图
什么是图? 图是一种与树有些相似的数据结构。 实际上,在数学的概念上,树是图的一种。 我们知道树可以用来模拟很多现实的数据结构,比如:家谱/公司组织架构等等。 那么图长什么样子呢?或者什么样的数据使用图来模拟更合适呢? 人与人之间的关系网 互联网中的网络关系 广州地铁图 那么,什么是图呢? 我们会发现,上面的结点(其实图中叫顶点 Vertex)之间的关系,是不能使用树来表示(几叉树都不可以)。 这个时候,我们就可...转载 2021-06-03 08:42:50 · 655 阅读 · 0 评论 -
二叉搜索树-平衡二叉树-红黑树
二叉搜索树(BST,Binary Search Tree),也称为二叉排序树和二叉查找树。二叉搜索树是一棵二叉树,可以为空。如果不为空,则满足以下性质:条件 1:非空左子树的所有键值小于其根节点的键值。比如三中节点 6 的所有非空左子树的键值都小于 6; 条件 2:非空右子树的所有键值大于其根节点的键值;比如三中节点 6 的所有非空右子树的键值都大于 6; 条件 3:左、右子树本身也都是二叉搜索树;如上图所示,树二和树三符合 3 个条件属于二叉树,树一不满足条件 3 所以不是二叉树。转载 2021-06-02 12:43:20 · 352 阅读 · 0 评论 -
算法中的树结构
树的特点:树一般都有一个根,连接着根的是树干;树干会发生分叉,形成许多树枝,树枝会继续分化成更小的树枝;树枝的最后是叶子;现实生活中很多结构都是树的抽象,模拟的树结构相当于旋转 180° 的树。#树结构对比于数组/链表/哈希表有哪些优势呢?数组:优点:可以通过下标值访问,效率高;缺点:查找数据时需要先对数据进行排序,生成有序数组,才能提高查找效率;并且在插入和删除元素时,需要大量的位移操作;链表:优点:数据的插入和删除操作效率都很高;缺点:查找效率低,需要从头开始依次查找,直到找到目转载 2021-06-01 14:17:02 · 1457 阅读 · 0 评论 -
js链地址法生成哈希表
function HashTable(){ this.storage=[]; this.count=0//记录哈希表中已经存放了多少元素,决定数组是扩容还是减少容量 this.limit=7; //哈希表数组当前的总长度,保证扩容后还是质数 // 方法 // 哈希函数 HashTable.prototype.hashFunc=function(str,size){//size是数组的长度 /* 函数使index在数组长度内取index比较均匀, 1.在哈希表中原创 2021-05-31 21:10:41 · 269 阅读 · 0 评论 -
哈希表
认识哈希表哈希表是一种非常重要的数据结构,几乎所有的编程语言都直接或者间接应用这种数据结构。哈希表通常是基于数组实现的,但是相对于数组,它存在更多优势:哈希表可以提供非常快速的插入-删除-查找操作。 无论多少数据,插入和删除值都只需接近常量的时间,即O(1)的时间复杂度。实际上,只需要几个机器指令即可完成。 哈希表的速度比树还要快,基本可以瞬间查找到想要的元素。 哈希表相对于树来说编码要简单得多。哈希表同样存在不足之处:哈希表中的数据是没有顺序的,所以不能以一种固定的方式(比...转载 2021-05-26 19:05:52 · 3600 阅读 · 0 评论 -
字典
字典特点字典存储的是键值对,主要特点是一一对应。 比如保存一个人的信息 数组形式:[19,"Tom", 1.65],可通过下标值取出信息。 字典形式:{"age": 19, "name": "Tom", "height": 165},可以通过key取出value。 此外,在字典中 key 是不能重复且无序的,而 Value 可以重复。字典和映射的关系有些编程语言中称这种映射关系为字典,如 Swift 中的Dictonary,Python 中的dict。 有些编程语言中称这...转载 2021-05-26 17:12:24 · 266 阅读 · 0 评论 -
集合
几乎每种编程语言中,都有集合结构。集合比较常见的实现方式是哈希表,这里使用 JavaScript 的 Object 进行封装。集合特点 集合通常是由一组无序的、不能重复的元素构成。 数学中常指的集合中的元素是可以重复的,但是计算机中集合的元素不能重复。 集合是特殊的数组。 特殊之处在于里面的元素没有顺序,也不能重复。 没有顺序意味着不能通过下标值进行访问,不能重复意味着相同的对象在集合中只会存在一份。 封装集合ES6 中的Set就是一个集合类,这里我们重新封..转载 2021-05-26 16:57:35 · 89 阅读 · 0 评论 -
双向链表
单向链表只能从头遍历到尾或者从尾遍历到头(一般从头到尾)。 链表相连的过程是单向的,实现原理是上一个节点中有指向下一个节点的引用。 单向链表有一个比较明显的缺点:可以轻松到达下一个节点,但回到前一个节点很难,在实际开发中, 经常会遇到需要回到上一个节点的情况。双向链表既可以从头遍历到尾,也可以从尾遍历到头。 链表相连的过程是双向的。实现原理是一个节点既有向前连接的引用,也有一个向后连接的引用。 双向链表可以有效的解决单向链表存在的问题。 双向链表缺点: 每次在插入或删除某个节点时,都需转载 2021-05-26 12:24:42 · 158 阅读 · 0 评论 -
单向链表
认识链表链表和数组链表和数组一样,可以用于存储一系列的元素,但是链表和数组的实现机制完全不同。数组 存储多个元素,数组(或列表)可能是最常用的数据结构。 几乎每一种编程语言都有默认实现数组结构,提供了一个便利的[]语法来访问数组元素。 数组缺点: 数组的创建需要申请一段连续的内存空间(一整块内存),并且大小是固定的,当前数组不能满足容量需求时,需要扩容。 (一般情况下是申请一个更大的数组,比如 2 倍,然后将原数组中的元素复制过去) 在数组开头或中间位置插入..转载 2021-05-24 20:58:47 · 582 阅读 · 0 评论 -
队列--优先队列
认识队列队列(Queue)是一种运算受限的线性表,特点:先进先出。(FIFO:First In First Out)受限之处:只允许在表的前端(front)进行删除操作。 只允许在表的后端(rear)进行插入操作。生活中类似队列结构的场景:排队,比如在电影院,商场,甚至是厕所排队。 优先排队的人,优先处理。 (买票、结账、WC)。队列图解队列在程序中的应用打印队列:计算机打印多个文件的时候,需要排队打印。 线程队列:当开启多线程时,当新开启的线程所需的资源不足时就先放入转载 2021-05-24 17:43:21 · 528 阅读 · 0 评论 -
栈
数组是一个线性结构,并且可以在数组的任意位置插入和删除元素。 但是有时候,我们为了实现某些功能,必须对这种任意性加以限制。 栈和队列就是比较常见的受限的线性结构栈(stack)是一种运算受限的线性表:LIFO(last in first out)表示就是后进入的元素,第一个弹出栈空间。类似于自动餐托盘,最后放上的托盘,往往先把拿出去使用。 其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的转载 2021-05-24 15:21:21 · 173 阅读 · 0 评论