算法
heiheiheiheiheiheii
这个作者很懒,什么都没留下…
展开
-
最小覆盖子串
/** * 解题思路 * - 包含所有的包含 T 的子串 * - 找出长度最小的那个字串,返回即可。 * * 解题步骤 * - 用双指针维护一个滑动窗口。 * - 移动右指针,找到包含 T 的子串,移动左指针,尽量减少包含 T 的子串的长度. */ /** * @param {string} s * @param {string} t * @return {string} */ var minWindow = function(s, t) { let l = 0, .原创 2022-05-31 14:13:07 · 245 阅读 · 0 评论 -
利用栈来解决博客目录生成
在开发博客项目中,需要使用 markdown 生成了对应的文章,生成文章之后提取出来 h1 和 h2 标签来组成对应的目录结构。 示例 1: 输入: ['H1', 'H1', 'H2', 'H2', 'H2', 'H1', 'H2'] 输出: [{tag: 'h1', children: [{}, {}, {}]}, {tag: 'h1', children: []}] 解题思路: 使用栈结构,stack 来进行存放 h1 标签。 使用另一个栈 o_stack 来保存当前所处的 h1 标签原创 2022-05-15 13:35:31 · 157 阅读 · 0 评论 -
JavaScript 实现栈结构
栈是一种数据结构,其特点是先进后出,后进先出的一种特征。我们遇到只在一头操作,并且是采用先进后出,后进先出的原则,我们可以优先考虑栈结构。 function Stack() { this.data = []; this.count = 0; } Stack.prototype = { push: function(element) { this.data[this.count] = element; ++this.count; re原创 2022-01-11 10:19:53 · 402 阅读 · 0 评论 -
JavaScript 实现循环双链表
function Node(data) { this.data = data; this.next = null; this.prev = null; } function DoubleList() { this.head = new Node('head'); this.head.next = this.head; this.head.prev = this.head; this.length = 0; } DoubleList.prototype.原创 2022-01-04 21:07:31 · 113 阅读 · 0 评论 -
JavaScript 实现双链表
function Node(data) { this.data = data; this.next = null; this.prev = null; } function DoubleList() { this.head = null; this.length = 0; } DoubleList.prototype = { // 查找节点 findElement: function(element) { let head = thi.原创 2022-01-03 17:52:02 · 69 阅读 · 0 评论 -
JavaScript 实现循环单链表
function Node(data) { this.data = data; this.next = null; } function CirSingleList() { this.head = new Node('head'); this.length = 0; } CirSingleList.prototype = { // 寻找一个节点 findElement: ...原创 2022-01-02 14:32:52 · 655 阅读 · 0 评论 -
JavaScript 实现不带头单链表
function Node(data) { this.data = data; this.next = null; } function SingleList() { this.head = null; this.length = 0; } SingleList.prototype = { // 查找节点 findElement: function(element) { let head = this.head; if (h.原创 2022-01-02 00:12:59 · 420 阅读 · 0 评论 -
JavaScript 实现带头单链表
在 JavaScript 中,我们使用数组来进行有序序列的数据存放,方便省事,而且在 JavaScript 中我们不需要担心数组大小不够扩容问题,并且找某个位置上的数据的复杂度为 O(1),但是在任意位置上删除和添加的平均时间复杂度为 O(n),我们使用链表的删除和增加时间复杂度是为 O(1) 的,所以我们来实现一个单链表。 class Node { constructor(data) { this.data = data; this.next = null; .原创 2022-01-01 16:07:26 · 595 阅读 · 0 评论 -
数组(Array)
数组可以说是一种非常基础的数据结构。看起来非常的简单,其实还有很多的门道。 数组是一种线性表结构,一个固定长度的存储的数据结构,数组中的元素被存储在一段连续的内存空间中。 线性表结构:就是数据是排列成一排的像一条线一样的结构。这类结构是指存在前后两个方向的。在数据结构中,除了数组,还有链表、队列、栈等也是线性表。 非线性表结构:代表数据不仅有前后两个关系,比如二叉树、堆、图。 连续的内存空间和相同的类型的数据。正式因为这个特点,数组才能够实现一个随机访问,我们可以以索引的方式访问数组的数据元素。原创 2021-12-20 13:32:29 · 253 阅读 · 0 评论 -
删除排序数组中的重复项
给你一个有序数组 nums,请你 原地 删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 涉及到 数组、双指针。 如果左指针和右指针指向的值一样,说明有重复的,这个时候,左指针不动,右指针继续往右移。如果他俩指向的值不一样就把右指针指向的值往前挪 /** * @param {number[]} nums * @return {number} */ var removeDupli...原创 2021-12-19 21:45:40 · 295 阅读 · 0 评论 -
复杂度分析
时间、空间复杂度这篇文章中,我们从时间、空间复杂度方面进行了讲解关于所以的复杂度表示,这次我们从另一方面来分析一下复杂度。 最好、最坏时间复杂度。 function find(arr, n, x) { let i = 0; let pos = -1; for (; i < n; ++i) { if (arr[i] == x) { pos = i; break; } } ret.原创 2021-12-09 21:12:36 · 175 阅读 · 0 评论 -
时间复杂度和空间复杂度
数据结构和存在的算法本身就是为了解决“块” 和 “省”的问题,执行效率是算法一个非常重要的考量指标。那么如何才能衡量出的编写代码的执行效率呢?这最需要我们测量你编写代码的时间和空间复杂度了。 你可能会想,市面上已经有许多工具,可以帮你测量出你代码的一个执行时间和一个占用内存大小,大佬做的,肯定非常的不错,但这也仅仅是发生在你编写完代码之后跑的那一刻才能知道,大佬在牛逼,也是他牛逼,他怎么也不会知道你在一开始计划编码这段代码的时候是怎么想的,这一切你才是主角,你的在这个过程中衡量到底我是用哪种数据结构对应哪原创 2021-12-08 19:33:40 · 451 阅读 · 0 评论 -
数据结构和算法。
我来讲讲我对数据结构和算法的看法,数据结构和算法好比一道坎,没有勇气去迈过去,找工作被数据结构拖后腿,作为一个前端成为一个代码搬运工,业务开发工程师,就整天的 CRUD(增删改查),就根本就用不到数据结构和算法,我们用别人的封装好的,不需要自己实现,都给你弄好了,但不代表你不需要取了解。 为什么使用这种算法而不是用那种算法,不懂的计算时间复杂度和空间复杂度,你如何能用好它,用对它,就算你是一个搬运工,你也要成为一个懂得取舍的搬运工,搬运工可不是什么都搬的,你得搬对,那你首先是不是得选择好。那么如何才能选择原创 2021-12-07 19:43:36 · 196 阅读 · 0 评论