【算法】深入掌握算法系列
JavaScript-Algorithms - 题源地址
labuladong的算法小抄 - 好的算法学习资料
前言
作为业务开发,虽然在平常开发中很少写算法,但当我们需要深入框架、开发语言、开源库时,懂算法将大大提高我们看源码的能力。例如 :
- virtual-dom diff 算法做了一些约定,后将原先 O(n3) 的时间复杂度降到了O(n) ,核心原理就是一个树的深度优先搜索
- babel 这些就是一些编译原理的 parser 生成抽象语法树的知识,再将抽象语法树进行转换操作生成文件
- 浏览器的 history,底层可以使用栈来实现
- webpack 中利用 tree-shaking 优化
- v8 中的调用栈、消息队列等等
这些就大量使用了算法,看懂了就能更好的了解它们的性能,更高效的解决问题,提升我们的代码质量与思维视野,进阶到更高 Level,赚更多钱💰💰💰。
计划
给自己定个小目标,把下面深入掌握算法的小题全过一遍,每天最少一题;
目前先附上源地址,后续自己做好后更新题目后的链接地址,并标记清除,比如 ✅图解leetcode88:合并两个有序数组
深入掌握算法
分为四个模块:数据结构、算法、设计、基础架构等
数据结构
数组篇
- ✅图解leetcode88:合并两个有序数组
- ✅字节&leetcode1:两数之和
- ✅腾讯&leetcode15:三数之和
- 字节:N数之和
- 腾讯:数组扁平化、去重、排序
- ✅leetcode349:给定两个数组,编写一个函数来计算它们的交集
- ✅华为&leetcode146:设计和实现一个LRU(最近最少使用)缓存机制
- 阿里算法题:编写一个函数计算多个数组的交集
- ✅leetcode352: 将数据流变为多个不相交区间
链表
- ✅leetcode21:合并两个有序链表
- ✅有赞&leetcode141:判断一个单链表是否有环
- ✅图解leetcode206:反转链表
- ✅leetcode876:求链表的中间结点
- ✅leetcode19:删除链表倒数第 n 个结点
- ✅图解字节&leetcode160:编写一个程序,找到两个单链表相交的起始节点
- ✅腾讯&leetcode611:有效三角形的个数
- 快手算法:链表求和
- leetcode42:接雨水问题
字符串
- ✅字节&leetcode151:翻转字符串里的单词
- ✅图解拼多多&leetcode14:最长公共前缀(LCP)
- 百度:实现一个函数,判断输入是不是回文字符串
- ✅字节&Leetcode3:无重复字符的最长子串
- ✅Facebook&字节&leetcode415: 字符串相加
- ✅腾讯&leetcode43:字符串相乘
- ✅腾讯&剑指 Offer 67. 把字符串转换成整数
栈
- ✅字节&leetcode155:最小栈(包含getMin函数的栈)
- ✅图解腾讯&哔哩哔哩&leetcode20:有效的括号
- ✅leetcode1047:删除字符串中的所有相邻重复项
- leetcode1209:删除字符串中的所有相邻重复项 II
- 面试真题:删除字符串中出现次数 >= 2 次的相邻字符
队列
哈希表
- ✅leetcode349:给定两个数组,编写一个函数来计算它们的交集
- ✅字节&leetcode1:两数之和
- ✅腾讯&leetcode15:三数之和
- ✅leetcode380:常数时间插入、删除和获取随机元素
- ✅剑指Offer50:第一个只出现一次的字符
二叉树
二叉树的遍历
- ✅字节&leetcode144:二叉树的前序遍历
- ✅字节&leetcode94:二叉树的中序遍历
- ✅字节&leetcode145:二叉树的后序遍历
- ✅leetcode102:二叉树的层序遍历
- ✅l字节&leetcode107:二叉树的层次遍历
重构二叉树
二叉树进阶
- ✅l腾讯&leetcode104:二叉树的最大深度
- ✅字节&腾讯leetcode236:二叉树的最近公共祖先
- ✅剑指Offer&leetcode110:平衡二叉树
- ✅字节&leetcode112:路径总和
- ✅剑指Offer&leetcode101:对称二叉树
- 字节一面:给定一个二叉树, 找到该树中两个指定节点间的最短距离
- ✅腾讯&leetcode230:二叉搜索树中第K小的元素
- 二叉树的左右子树交换
堆
图
算法技巧
排序算法
- 腾讯&字节:介绍一下快排原理以及时间复杂度,并实现一个快排
- 字节&阿里&网易&leetcode384:打乱数组(洗牌算法)
- 阿里五面:说下希尔排序的过程? 希尔排序的时间复杂度和空间复杂度又是多少?
- 腾讯&leetcode148:排序链表
- 字节算法题:扑克牌问题(反向推导题)
- 腾讯&leetcode611:有效三角形的个数
查找算法
- ✅腾讯:简述二分查找算法与时间复杂度,并实现一个二分查找算法
- ✅腾讯&字节&leetcode34:在排序数组中查找元素的第一个和最后一个位置
- 腾讯&leetcode230:二叉搜索树中第K小的元素
- 腾讯&leetcode875:爱吃香蕉的珂珂
动态规划
- ✅字节&leetcode70:爬楼梯问题
- 字节&leetcode746:使用最小花费爬楼梯
- 字节二面&leetcode53:最大子序和
- ✅腾讯&leetcode121:买卖股票的最佳时机
- 腾讯&leetcode647:回文子串
- 腾讯&leetcode5:最长回文子串
- 阿里&网易&leetcode64:最小路径和