Skip to content

⛩数据结构和算法解析 | LeetCode 解题 | 剑指 Offer 面试题集

Notifications You must be signed in to change notification settings

Reaper622/DataStructure-Algorithm-TS

Repository files navigation

DataStructure-Algorithm-TS

JavaScript DataStructure and Algorithm with TypeScript Questions on LeetCode

在线阅读地址: 数据结构和算法

数据结构

  • 二叉树

    • 二叉树的实现
    • 对称二叉树 | LeetCode[101]
    • 二叉树镜像 | 剑指Offer [19]
    • 检测二叉平衡树
    • 二叉树的层次遍历 | 剑指Offer [23]
    • 根据先序遍历和中序遍历结果重建二叉树
    • 根据中序遍历和后序遍历结果重建二叉树
    • 路径总和 | 剑指Offer [25]
    • 二叉树展开为链表 | LeetCode [114]
    • 判断一个二叉树是否为另一个二叉树的子树 | LeetCode [572] | 剑指Offer [18]
    • 二叉搜索树的后序遍历序列 | 剑指Offer[24]
  • 链表

    • 链表的实现
    • 链表的查询,插入,删除
    • 链表的正向遍历与反向遍历
    • 反转链表 | LeetCode [206]
    • 合并链表 | LeetCode [21]
    • 删除链表的倒数第N个结点 | LeetCode [19] | 剑指Offer [15]
    • 链表结点交换 | LeetCode [24]
    • 分隔链表 | LeetCode [86]
    • 反转链表 II | LeetCode [206]
    • 重排链表 | LeetCode [143]
    • 链表的中间结点 | LeetCode [876]
    • 两个链表的第一个公共结点 | 剑指Offer [37]
    • 两数相加 | LeetCode [2]
    • 链表排序 | LeetCode [148]
    • 合并K个有序链表 | LeetCode [23]
    • 栈的实现
    • 栈的基础操作
    • 栈的入序和出序序列匹配检测 | LeetCode [946] | 剑指Offer [22]
    • 最小栈 | LeetCode[155]
    • 有效的括号 | LeetCode [20]
  • 队列

    • 队列的实现
    • 队列的基础操作
    • 循环队列的实现和基础操作 | LeetCode [622]
    • 循环双端队列 | LeetCode [641]
    • 堆的实现
    • 堆的基础操作
  • 数组

    • 和为Sum的两个数字 | 剑指Offer [41]
    • 和为Sum的连续整数序列 | 剑指Offer [41]
    • 两数之和 | LeetCode [1]
    • 三数之和 | LeetCode [15]
    • 四数之和 | LeetCode [18]
    • 顺时针打印矩阵 | 剑指Offer [20]
    • 对角线遍历矩阵 | LeetCode [498]
    • 数组中出现次数超过数组一半的数字 | 剑指Offer [29]
    • 连续子数组的最大和 | 剑指Offer [31]
    • 反转字符串 | LeetCode [344]
    • 按奇偶排序数组 | LeetCode [905] | 剑指Offer [14]
    • 扑克牌的顺子 | 剑指Offer [44]
    • 岛屿的最大面积 | LeetCode [695]
    • 朋友圈 | LeetCode [547]
    • 合并区间 | LeetCode [56]
    • 接雨水 | LeetCode [42]
    • 寻找两个有序数组的中位数 | LeetCode[4]
    • 最接近的三数之和 | LeetCode [16]
    • 删除排序数组中的重复项 | LeetCode [26]
    • 盛最多水的容器 | LeetCode [11]
  • 字符串

    • 最长公共前缀 | LeetCode [14]
    • 计数二进制子串 | LeetCode [696]
    • 二进制求和 | LeetCode [67]
    • 无重复字符的最长子串 | LeetCode [3]
    • 字符串的排列 | LeetCode [567]
    • 字符串相加 | LeetCode [415]
    • 字符串相乘 | LeetCode [43]
    • 复原IP地址 | LeetCode [93]
    • 最长回文子串 | LeetCode [5]
  • LRU缓存结构

    • LRUCache | LeetCode [146]

算法

时间复杂度

一个算法的时间复杂度反映了程序运行从开始到结束所需要的时间。把算法中基本操作重复执行的此处作为算法的时间复杂度。

  • O(1): 常数复杂度
  • O(log n): 对数复杂度
  • O(n): 线性时间复杂度
  • O(n^2): 平方复杂度
  • O(n^3): 立方复杂度
  • O(2^n): 指数复杂度
  • O(!n): 阶乘复杂度

空间复杂度

空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需内存有预先估计。

一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。

算法目录

  • 排序

    • 插入排序
    • 冒泡排序
    • 选择排序
    • 快速排序
    • 归并排序
    • 堆排序
  • 递归

    • 斐波那契数列 | LeetCode [509]
    • 爬楼梯 | LeetCode [70]
    • Pow 「求x的n次幂」 | LeetCode [50]
    • 翻转整数变为字符串 | Bilibili 面试编程题
  • 动态规划

    • 斐波那契数列 | LeetCode [509]
    • 泰波那契数列 | LeetCode [1137]
    • 杨辉三角 | LeetCode [118]
    • 打家劫舍 | LeetCode [198]
    • 打家劫舍 II | LeetCode [213]
    • 第N个丑数 | LeetCode [264] | 剑指Offer [34]
    • 最大正方形 | LeetCode [221]
    • 三角形的最小路径和 | LeetCode [120]
    • 俄罗斯套娃信封问题 | LeetCode [354]
    • 除自身以外数组的乘积 | LeetCode[238]
  • 贪心算法

    • 买卖股票的最佳时机 | LeetCode [121]
    • 买卖股票的最佳时机II | LeetCode [122]
    • 买卖股票的最佳时机(含手续费) | LeetCode [714]
    • 分发饼干 | LeetCode [455]
    • 连续子数组的最大和 | 剑指Offer [31]
    • 最大正方形 | LeetCode [221]
  • 二分查找

    • 二分查找的实现 | LeetCode [704]
    • 二分求解x的平方根 | LeetCode [69]
    • 搜索旋转排序数组 | LeetCode [33]
    • 寻找峰值 | LeetCode [162]
    • 寻找旋转排序数组中的最小值 | LeetCode [153]
    • 在排序数组中查找元素的第一个和最后一个位置 | LeetCode [34]
    • 找到K个最接近的元素 | LeetCode [658]
    • 寻找比目标字母大的最小字母 | LeetCode [744]
    • 数字在排序数组中出现的次数 | LeetCode [34] | 剑指Offer [38]
  • 二进制

    • 不使用加减乘除运算符实现加减乘除
    • 二进制中1的个数 | LeetCode [191] | 剑指Offer [10]
    • 数组中只出现一次的数字 | 剑指Offer [40]
    • 不用加减乘除做加法 | 剑指Offer [47]
  • 回溯算法

    • 括号生成 | LeetCode [22]

测试 「使用 Jest 测试」

验证数据结构相关

npm run test:ds

验证算法相关

npm run test:al

使用Github Action 实现 CI/CD