- 前言
- 第一部分 博客
- 1. 2024
❱
- 1.1. 播客:AI 时代的频率跃迁背景下个人的选择:高频的卷或低频的定
- 1.2. 播客:张云帆的芒格之道
- 1.3. 播客:人生危机不是崩溃而是瓦解
- 1.4. 个人常用工具及技巧分享
- 1.5. 播客:rrweb 作者的某期播客节目纪要
- 第二部分 AGI
- 2. 前言
- 3. 入门篇
❱
- 3.1. chatGPT 是什么
- 3.2. chatGPT 的原理
- 3.3. DeepSeek LLM v3 和 DeepSeek R1 对比
- 3.4. 大模型是如何训练的?
- 3.5. LangChain(篇一:基础入门篇)
- 3.6. LangChain 概述
- 3.7. Dify notes
- 4. Agent
❱
- 4.1. Agent 是什么
- 4.2. Agent 工程架构图
- 4.3. Agent 的进化之路
- 第三部分 前端
- 5. 前言
- 6. 前端基础
❱
- 6.1. Web 技术概述
❱
- 6.1.1. 名词解释
- 6.1.2. Web 技术概述
- 6.1.3. 前端技术
- 6.1.4. 现代 Web 技术现状
- 6.1.5. Web 新兴技术
- 6.2. HTML
❱
- 6.2.1. HTML 概述
- 6.2.2. HTML 标签与 HTML 属性
- 6.2.3. HTML 技术关键词
- 6.2.4. HTML 技术清单
- 6.2.5. HTML 标签
- 6.2.6. Web Components
- 6.2.7. HTML 标准规范
- 6.2.8. 响应式图片
- 6.2.9. HTML 模板语言
- 6.3. CSS
❱
- 6.3.1. CSS 简介
- 6.3.2. 媒体查询
- 6.3.3. CSS 兼容性相关
- 6.3.4. 回流和重绘
- 6.3.5. 开启 GPU 硬件加速的原理
- 6.3.6. 盒模型
- 6.3.7. BFC 与外边距重叠
- 6.3.8. CSS 布局都有哪些
- 6.3.9. CSS 定位或布局相关的参考坐标系
- 6.3.10. CSS 定位
- 6.3.11. 滚动自动吸附效果与吸顶效果
- 6.3.12. CSS 变量
- 6.3.13. CSS 的计算属性
- 6.3.14. CSS 处理器
- 6.3.15. CSS 选择器的优先级
- 6.3.16. CSS Houdini API
- 6.3.17. Tailland CSS
- 6.3.18. CSS 性能优化思路
- 6.3.19. rem 和 vw、vh
- 6.4. JavaScript
❱
- 6.4.1. JavaScript 简介
- 6.4.2. JavaScript 的组成
- 6.4.3. JavaScript 的核心语法
- 6.4.4. JavaScript 异步编程简介
- 6.4.5. JavaScript 异步编程:Promise 专题篇一
- 6.4.6. JavaScript 异步编程:Promise 专题篇二
- 6.4.7. JavaScript 异步编程:async、await 的实现原理
- 6.4.8. JavaScript 异步编程:Thunk 函数
- 6.4.9. 实现批量请求并支持控制最大并发数
- 6.4.10. JavaScript 的垃圾回收机制
- 6.4.11. JavaScript 引擎
- 6.4.12. JavaScript 对象
- 6.4.13. JavaScript 的单线程
- 6.4.14. JavaScript 内存泄漏场景及其解决方案
- 6.4.15. 深拷贝与浅拷贝
- 6.4.16. apply、call、bind 的区别及简易实现
- 6.4.17. 遍历对象的方式
- 6.4.18. javascript 中实现继承的方式
- 6.4.19. ES6(ES2015) 到 ES2024 的主要特性
- 6.4.20. class 中各种方法定义的区别
- 6.4.21. WeakRef 与 FinalizationRegistry
- 6.4.22. Array.reduce
- 6.4.23. this 指向问题汇总
- 6.4.24. BigInt 类型
- 6.4.25. 原型链
- 6.5. TypeScript
❱
- 6.5.1. Typescript 基础篇
- 6.5.2. type 和 interface 的区别
- 6.5.3. TS 常见问题
- 6.5.4. interface
- 6.5.5. Interface 中的运算符操作
- 6.5.6. TypeScript 中与类型相关的运算符
- 6.5.7. TypeScript 的泛型(Generics)
- 6.5.8. TypeScript 项目中使用 node_modules 中定义的全局类型
- 7. 浏览器
❱
- 7.1. 哪些事件不会冒泡的事件,以及为什么不支持冒泡?
- 7.2. 使用 requestAnimationFrame 批量处理操作的原理
- 7.3. MessageChannel
- 7.4. 如何检测页面是否在前台运行
- 7.5. 为什么要用 setTimeout 模拟 setInterval ?
- 7.6. 浏览器本地如何读取并处理本地大文件
- 7.7. WebAssembly (Wasm)
- 7.8. Shadow DOM 中的 closed mode 和 open mode
- 7.9. 堆叠上下文 与 z-index 的关系
- 7.10. 浏览器的渲染原理
- 7.11. 渲染层、复合层、层叠上下文对比
- 7.12. 渲染层(Paint Layer)和合成层(Composite Layer)
- 7.13. 渲染层(Paint Layer)和层叠上下文(Stacking Context)
- 7.14. 浏览器中如何查找内存泄漏
- 7.15. 现代 Chrome 浏览器架构设计
- 7.16. requestIdleCallback
- 7.17. Shadow dom 与 Web Component
- 7.18. BroadcastChannel 和 MessageChannel 对比
- 7.19. 跨域与跨页面通讯
- 7.20. 跨域时请求的实际发送情况分析
- 7.21. 浏览器实现截图
- 7.22. AbortController
- 7.23. queueMicrotask
- 7.24. BroadcastChannel
- 7.25. 浏览器的宏任务(MacroTask)的优先级
- 7.26. IndexedDB
- 7.27. cookie 的有效期设置为 0 会怎么样?
- 8. Node.js
❱
- 8.1. cjs 与 esm
- 8.2. Nodejs 加载 JSON 文件
- 8.3. commonjs 的 require 机制
- 8.4. 常用的 package.json 字段说明
- 8.5. Nodejs 的单线程与多核
- 8.6. 流与pipe
- 8.7. Node.js 中的通信方式都有哪些
- 8.8. nodejs server 端如何清除 cookie
- 8.9. Node.js 中提高网络传输速度的主要方法
- 8.10. RESTful 接口规范
- 8.11. TCP 粘包
- 8.12. TIME_WAIT 过多的原因以及解决方案
- 8.13. socket hang up
- 8.14. ECONNRESET
- 8.15. Koa 的核心原理
- 8.16. Koa 与 express 对比
- 8.17. 实现一个简易版的 Koa
- 8.18. Nginx 介绍
- 8.19. pnpm(performant npm)
- 8.20. koa 的中间件机制
- 9. 前端框架
❱
- 9.1. Vue
❱
- 9.1.1. Vue3 基础:篇一
- 9.1.2. Vue3 基础:篇二
- 9.1.3. Vue3 基础:篇三
- 9.1.4. Vue3 中 is 属性的使用方法和应用场景
- 9.1.5. Vue3 组件
- 9.1.6. Vue 的整体设计思路
- 9.1.7. Vue3 的响应式原理:effect、computed、watch 的实现原理
- 9.1.8. Vue3 中 effect 的调度选项(scheduler)使用示例
- 9.1.9. Vue3 的非原始值响应式方案(Map、WeakMap 、Set 、WeakSet )
- 9.1.10. vue3 watch 的详细用法(取消监听、恢复监听及清理副作用等)
- 9.1.11. Vue3 中原始值的响应方案
- 9.1.12. Vue3 渲染器的原理和实现
- 9.1.13. Vue3 的 diff 算法
- 9.1.14. Vue3 的 Diff 算法复杂的分析
- 9.1.15. Vue3 事件与原生事件的关系和冒泡机制差异分析
- 9.1.16. Vue3 组件的实现原理
- 9.1.17. 异步组件和函数式组件的实现原理
- 9.1.18. Vue3 异步组件的使用
- 9.1.19. Vue3 中 Transition 组件的实现原理
- 9.1.20. Vue3 中 keepAlive组件的实现原理
- 9.1.21. Vue3中 Teleport 组件的实现原理
- 9.1.22. Vue3 的编译器原理(篇一:基本实现)
- 9.1.23. Vue3 的编译器原理(篇二:完善的 HTML 解析器)
- 9.1.24. Vue3 的编译器原理(篇三:编译优化)
- 9.1.25. Vue3 的服务端渲染(SSR)原理(同构原理)
- 9.1.26. Vue3 中可使用 JSX 原理
- 9.1.27. Vue3 中不常用的 API
- 9.1.28. Vue3 源码主要包功能介绍分析
- 9.1.29. vue3 中实现类似于 React 高阶组件的功能?
- 9.1.30. Pinia 状态管理库文档笔记
- 9.1.31. Vue3 的页面渲染流程
- 9.1.32. created 和 mounted 这两个生命周期钩子的区别
- 9.1.33. v-memo 介绍
- 9.1.34. Vue3 的模板编译也可以发生在运行时
- 9.1.35. Vue3 生态最新动态
- 9.2. React
❱
- 9.2.1. useEffect
- 9.2.2. useLayoutEffect 和 useEffect
- 9.2.3. 为什么 React 要引入 Hooks
- 9.2.4. 为什么不应该在循环、条件或嵌套函数中使用 Hooks
- 9.2.5. React 的 Render Props
- 9.2.6. React 的架构设计演变
- 9.2.7. useMemo 、 useCallback、Vue 的 computed
- 9.2.8. useRef、forwardRef 的用法及实现原理
- 9.2.9. 深入理解 JSX
- 9.2.10. React 的 Capture Value(捕获值)特性与解决方案
- 9.2.11. React 重新渲染的场景以及对应的优化方案
- 9.2.12. 强制重新渲染有哪些方式
- 9.2.13. React.memo 、 useMemo 、 useCallback 对比
- 9.2.14. PureComponent
- 9.2.15. 无状态组件(Stateless Component)概念、原理及最佳实践
- 9.2.16. React 组件的各种定义和声明方式
- 9.2.17. React 中获取 DOM 引用的方式
- 9.2.18. 高阶组件(HOC)
- 9.2.19. React 组件间通信
- 9.2.20. React 性能优化的思路
- 9.2.21. react-dom
- 9.2.22. React 事件系统
- 9.2.23. React 中实现异步加载组件
- 9.2.24. React 中错误捕获的方式
- 9.2.25. React Class 类生命周期如何对应 Hooks
- 9.2.26. React.createContext 与 useContext
- 9.2.27. immer.js 在 React 中的使用
- 9.2.28. Redux
- 9.2.29. React 整体架构介绍
- 9.2.30. React Fiber 节点的主要属性及其用途
- 9.2.31. React 的源码结构分析
- 9.2.32. 使用 useTransition 进行非阻塞渲染
- 9.2.33. 使用 useDeferredValue 来延迟状态更新
- 9.2.34. 使用 useInsertionEffect 注入 css-in-js
- 9.2.35. 使用 useImperativeHandle 精确控制组件对外暴露能力
- 9.2.36. 使用 useSyncExternalStore 来连接外部状态和 React 组件
- 9.2.37. 使用 useId 生成唯一的 ID 标识符
- 9.2.38. 把 useDebugValue 加入你的React调试工具库
- 9.2.39. 说说 React 19 的最新的进展
- 9.2.40. React Server Components (RSC)
- 9.2.41. React 的 Diff 算法
- 9.2.42. React Hooks 的原理
- 9.2.43. 常见自定义 Hooks
- 9.2.44. React 的优先级调度机制和打断处理
- 9.2.45. 任务饥饿(Task Starvation)
- 9.2.46. 为什么 React 需要 Fiber 架构,而 Vue 似乎不需要类似的机制
- 9.2.47. React render 方法的原理和触发时机
- 9.2.48. React 中的 Portal 事件冒泡机制
- 9.2.49. React 的合成事件(Synthetic Event)和原生事件(Native Event)的执行顺序
- 9.2.50. React 自动运行时(Automatic Runtime)
- 9.3. 前端框架设计
❱
- 9.3.1. 前端框架设计概述
- 9.3.2. 前端框架设计里的"权衡" 与"选择"
- 9.3.3. 前端框架设计的核心要素
- 9.3.4. 前端元框架
- 9.3.5. 企业级框架
- 9.3.6. 编译时框架 vs 运行时框架
- 9.3.7. 前端框架现状及未来趋势
- 9.3.8. 前端框架后面的金主及生态情况
- 9.3.9. 前端框架的岛屿架构(Island Architecture)
- 9.3.10. 实现一个简易版本的前端路由
- 9.3.11. Next.js 与 Umi.js
- 9.3.12. UmiJS 与 Remix
- 9.3.13. umi 的数据流方案
- 9.3.14. Next.js
- 9.3.15. 对比 Next.js 与 Nuxt.js
- 9.3.16. Remix 框架
- 10. 前端工程化
❱
- 10.1. 前端基建
❱
- 10.1.1. 前端工程化
- 10.1.2. 前端工程化历程
- 10.1.3. 前端工程化 SOP
- 10.1.4. 前端基建 SOP
- 10.1.5. npm 私服搭建
- 10.1.6. 如何提高前端研发效能
- 10.1.7. 如何前端脚手架 "泼出去的水" 的问题
- 10.1.8. 前端基础建设路线参考
- 10.1.9. 开源的 git 托管工具
- 10.1.10. DevOps 开源项目
- 10.1.11. 圈复杂度
- 10.1.12. 好文分享:美团的产研一体化协作平台
- 10.1.13. 美团前端工程架构的演变
- 10.1.14. 字节跳动现代 Web 开发实践
- 10.1.15. 前端灰度发布
- 10.2. 前端构建
❱
- 10.2.1. Webpack 5 的 Module Federation
- 10.2.2. webpack 性能优化的思路
- 10.2.3. vite 中如何使用 Module Federation
- 10.2.4. 主流的前端构建工具
- 10.2.5. Vite 和 Webpack 在热更新(HMR - Hot Module Replacement)机制上的主要区别
- 10.2.6. 前端构建提速的体系化思路
- 10.2.7. Rspack 分享
- 10.2.8. Webpack 5
- 10.2.9. Eslint 的原理
- 10.2.10. Umi 4 的设计思路
- 10.2.11. vite 之 import 关键词
- 10.2.12. Turbopack 与 rspack
- 10.2.13. 使用 Babel 重构或迁移前端工程
- 10.2.14. Babel 插件开发
- 10.2.15. Babel 的原理(篇一)
- 10.2.16. Babel 的原理(篇二)
- 10.2.17. Webpack 的三种hash模式
- 10.2.18. Source Map 的本质和实现原理
- 10.2.19. 浏览器对 Source Map 的支持机制和实现原理
- 10.2.20. Vite 在开发时对 Source Map 的特殊之处
- 10.3. 前端监控
❱
- 10.3.1. Node.js 中常见的内存泄漏场景及解决方案
- 10.3.2. Node.js 中异常捕获和容错的常见处理方式
- 10.3.3. 前端数据采集的原理及实现
- 10.3.4. 时光机(录制与回放)的技术原理
- 10.3.5. rrweb
- 10.3.6. window.onerror 和 window.addEventListener 的区别?
- 10.3.7. 前端错误的分类、优先级管理及处理策略
- 10.3.8. 前端错误的分类和优先级管理建议
- 10.3.9. 前端指标监控与业务指标监控
- 10.4. 前端安全
❱
- 10.4.1. XSS:跨站脚本攻击
- 10.4.2. CSRF:跨站请求伪造
- 10.4.3. SSRF(服务器端请求伪造)攻击
- 10.4.4. 内容安全策略(Content Security Policy,简称 CSP)
- 10.4.5. X-XSS-Protection 头部、 Subresource Integrity (SRI)
- 10.4.6. 前端安全相关
- 10.4.7. 点击劫持 ( Clickjacking )
- 10.4.8. HTTP 请求是否携带 Cookie
- 10.4.9. 常见接口鉴权方式
- 10.4.10. 常见的高危Web安全漏洞
- 10.4.11. OAuth 2.0 认证
- 11. 前端性能及体验
❱
- 11.1. 如何度量前端性能
- 11.2. 性能优化思路
- 11.3. 长列表或大数据渲染优化的一些思路
- 11.4. 如何治理端侧性能
- 11.5. 常见性能优化思路
- 11.6. RAIL 模型
- 11.7. 高性能插入 100000 个 DOM节点
- 11.8. 人机交互与前端体验
- 11.9. 最大偏移量的统计方法和优化建议
- 11.10. PerformanceObserver API
- 11.11. LCP 、白屏时间、首屏时间
- 11.12. Chrome DevTools(篇一)
- 11.13. Chrome DevTools(篇二)
- 11.14. Chrome DevTools(篇三)
- 12. 前端架构设计
❱
- 12.1. 前端资产
- 12.2. 前端重构的时机
- 12.3. 前端研发工作台
- 12.4. 微前端原理(篇一)
- 12.5. SystemJS 和模块联邦(Module Federation)的特点和差异
- 12.6. 微前端原理(篇三:乾坤)
- 12.7. 微前端原理(篇二:无界)
- 12.8. JAMstack 架构
- 12.9. 前端语言包切换
- 12.10. 常见的设计模式
- 12.11. 前端常见的架构思路:篇一
- 12.12. Serverless(无服务器计算)
- 12.13. 前端常见的架构思路:篇二
- 12.14. 实现一个简单的插件系统
- 12.15. 代客
- 12.16. 度量前端架构
- 12.17. 技术架构与业务架构
- 12.18. 设计协同:D2C 、C2D
- 12.19. 编程思想&范式
- 13. 移动端与跨端
❱
- 13.1. 跨端(PC、移动端、小程序、Web 等)
- 13.2. 跨端的核心技术点
- 13.3. JavaScript Bridge(JSBridge)的原理
- 13.4. H5 开发技巧相关
- 13.5. taro 与 uni-app 对比
- 13.6. 小程序的安全合规和性能优化
- 13.7. 微信小程序的双线程设计
- 14. 前端系统设计
❱
- 14.1. 在线协作文档设计
- 14.2. UI 标记工具设计
- 14.3. 图标库管理系统设计
- 14.4. 转盘组件设计
- 14.5. SSO 系统与权限系统设计
- 14.6. 产品演示平台&培训平台
- 15. 低代码
❱
- 15.1. 分享:基于低代码平台的三种开发模式
- 15.2. 低代码平台的调试开发
- 15.3. 低代码的研发搭建模式探讨
- 15.4. 调研:Schema 协议设计(amis、schema 设计、事件流、Vdom 等)
- 15.5. 调研:Amis 工作原理、自定义组件
- 15.6. 调研:各类大会对低代码的分享
- 15.7. 调研:低代码渲染设计思路
- 15.8. 调研:编辑器&设计态如何设计?
- 15.9. 调研:低代码引擎技术白皮书
- 15.10. 低代码原理与标准
- 15.11. 好文:低代码实现原理
- 15.12. 好文:阿里低代码引擎和生态建设实战及思考
- 15.13. 调研:各类大会对低代码的分享
- 15.14. 好文:低代码探索之路
- 15.15. 好文:低代码常见问题
- 15.16. 精读:低代码的组件体系的建设和实践
- 15.17. 调研:设计器交互体验
- 15.18. 调研:低代码开发如何协同?
- 15.19. 基于 Vue3 的低代码平台架构设计:篇一
- 15.20. 低代码工程结构设计
- 16. 前端的思考
❱
- 16.1. 前端的思考:随记
- 16.2. 业务支撑与业务价值
- 16.3. 大模型背景下的前端研发模式随记
- 16.4. 前端工程师在 AI 时代的机会与挑战
- 16.5. 前端开发与 AI 大模型的集成
- 第四部分 算法
- 17. 前言
- 18. 基础
❱
- 18.1. 算法核心框架
- 18.2. 计算机算法的框架思维
- 18.3. 基础数据结构
- 18.4. 算法复杂度
- 18.5. 刷题注意事项
- 18.6. 刷题篇
- 19. 数组
❱
- 19.1. 数组基础
❱
- 19.1.1. 列表:Python 描述
- 19.1.2. 数组:JavaScript 描述
- 19.1.3. 数组链表与内存缓存的关系
- 19.2. 双指针
❱
- 19.2.1. 两数之和:无序
- 19.2.2. 最长回文子串
- 19.2.3. 盛最多水的容器:找两条线装水最多
- 19.2.4. 三数之和
- 19.2.5. 删除有序数组中的重复项
- 19.2.6. 移除元素:移除指定元素
- 19.2.7. 接雨水:下雨了柱子间能装多少水
- 19.2.8. 颜色分类
- 19.2.9. 删除有序数组中的重复项 II:最多允许重复两次
- 19.2.10. 合并两个有序数组
- 19.2.11. 验证回文串
- 19.2.12. 两数之和 II - 输入有序数组
- 19.2.13. 移动零 1
- 19.2.14. 移动零
- 19.2.15. 递增的三元子序列
- 19.2.16. 反转字符串
- 19.2.17. 反转字符串中的元音字母
- 19.2.18. 有序转化数组:f(x) = a * x * x + b * x + c
- 19.2.19. 判断子序列
- 19.2.20. 压缩字符串:b12 => b,1,2 代替
- 19.2.21. 匹配子序列的单词数: words中是 s 的子序列的单词个数
- 19.2.22. 有序数组的平方
- 19.2.23. 交替合并字符串
- 19.3. 滑动窗口
❱
- 19.3.1. 无重复字符的最长子串
- 19.3.2. 最小覆盖子串
- 19.3.3. 重复的DNA序列
- 19.3.4. 长度最小的子数组
- 19.3.5. 存在重复元素 II :两个重复元素的距离小于等于 k
- 19.3.6. 存在重复元素 III:两个数的差值不超过 t + 两个数的位置差不超过 k
- 19.3.7. 至多包含 K 个不同字符的最长子串:找出至多包含 k 个 不同 字符的最长子串
- 19.3.8. 至少有 K 个重复字符的最长子串
- 19.3.9. 替换后的最长重复字符:替换 k 次后最长重复字符数
- 19.3.10. 找到字符串中所有字母异位词
- 19.3.11. 字符串的排列
- 19.3.12. 子数组最大平均数 I
- 19.3.13. 乘积小于 K 的子数组:子数组内所有元素的乘积严格小于 k 的连续子数组的数目
- 19.3.14. 最大连续1的个数 III:最多 k 次把 0 变成 1,数组中连续 1 的最大个数
- 19.3.15. 定长子串中元音的最大数目
- 19.3.16. 删掉一个元素以后全为 1 的最长子数组
- 19.3.17. 将 x 减到 0 的最小操作数
- 19.4. 二维数组
❱
- 19.4.1. 最长公共前缀
- 19.4.2. 二维数组的遍历技巧
- 19.4.3. 矩阵置零
- 19.4.4. 搜索二维矩阵:打平成一维也严格递增
- 19.4.5. 搜索二维矩阵 II:行递增、列递增
- 19.4.6. 有序矩阵中第 K 小的元素
- 19.4.7. 重塑矩阵:mn 转成 rc
- 19.4.8. 转置矩阵
- 19.4.9. 二维网格迁移
- 19.4.10. 将矩阵按对角线排序
- 19.4.11. 相等行列对
- 19.5. 前缀和、前缀积、差分数组
❱
- 19.5.1. 前缀和
- 19.5.2. 前缀积
- 19.5.3. 差分数组
- 19.5.4. 最大子数组和
- 19.5.5. 除自身以外数组的乘积
- 19.5.6. 区域和检索 - 数组不可变
- 19.5.7. 二维区域和检索 - 矩阵不可变
- 19.5.8. 和等于 k 的最长子数组长度
- 19.5.9. 区间加法
- 19.5.10. 连续的子数组和
- 19.5.11. 连续数组
- 19.5.12. 和为 K 的子数组:返回 该数组中和为 k 的子数组的个数
- 19.5.13. 寻找数组的中心下标
- 19.5.14. 和可被 K 整除的子数组
- 19.5.15. 拼车
- 19.5.16. 航班预订统计
- 19.5.17. 表现良好的最长时间段
- 19.5.18. 矩阵区域和
- 19.5.19. 最后 K 个数的乘积
- 19.6. 其他
❱
- 19.6.1. 缺失的第一个正数:找第一个缺失的正整数
- 19.6.2. 合并区间
- 19.6.3. 反转字符串中的单词
- 19.6.4. 多数元素
- 19.6.5. 轮转数组
- 19.6.6. 种花问题
- 19.6.7. 拥有最多糖果的孩子
- 19.6.8. 确定两个字符串是否接近
- 19.6.9. 找到最高海拔
- 19.6.10. 找出两数组的不同
- 20. 链表
❱
- 20.1. 链表:JavaScript 描述
- 20.2. 链表:Python 描述
- 20.3. 两数相加:逆序存储,且只能存一位数字
- 20.4. 反转单链表:反转全部、反转前 N 个节点、反转一部分
- 20.5. 删除链表的倒数第 N 个结点
- 20.6. 合并两个有序链表
- 20.7. 合并 K 个升序链表
- 20.8. 两两交换链表中的节点
- 20.9. 旋转链表:将链表每个节点向右移动 k 个位置
- 20.10. 删除排序链表中的重复元素 II:删除所有重复的节点
- 20.11. 删除排序链表中的重复元素:去重
- 20.12. 分隔链表
- 20.13. 随机链表的复制
- 20.14. 判断链表是否有环
- 20.15. 找链表中第一个入环节点
- 20.16. 重排链表:1→n-1→2→n-2→...
- 20.17. 相交链表
- 20.18. 反转链表
- 20.19. 回文链表
- 20.20. 奇偶链表
- 20.21. 链表的中间结点:寻找链表的中间节点
- 20.22. 从未排序的链表中移除重复元素:不是去重
- 20.23. 链表最大孪生和
- 20.24. 删除链表的中间节点
- 21. 栈、列队、哈希表
❱
- 21.1. 栈
❱
- 21.1.1. 栈:Python 描述
- 21.1.2. 有效的括号:判断括号字符串是否合法的
- 21.1.3. 简化路径
- 21.1.4. 用队列实现栈
- 21.1.5. 字符串解码
- 21.1.6. 小行星碰撞
- 21.1.7. 使括号有效的最少添加
- 21.1.8. 从字符串中移除星号
- 21.2. 列队
❱
- 21.2.1. 单调列队算法
- 21.2.2. 列队:Python 描述
- 21.2.3. 双向队列:Python 描述
- 21.2.4. 优先级队列及 TopK 问题
- 21.2.5. 优先级队列:入队函数最简易实现(sort)
- 21.2.6. 优先级队列:Leetcode 中提供的数据结构介绍
- 21.2.7. 使用两个栈实现队列
- 21.2.8. 滑动窗口最大值
- 21.2.9. 查找和最小的 K 对数字
- 21.2.10. Dota2 参议院
- 21.2.11. 最近的请求次数
- 21.3. 哈希表
❱
- 21.3.1. 哈希表概述
- 21.3.2. 哈希集合
- 21.3.3. 字母异位词分组:按字母异位词分组
- 21.3.4. 最长连续序列
- 21.3.5. 字符串中的第一个唯一字符
- 21.3.6. 找不同
- 21.3.7. 数组中重复的数据:找出所有出现 两次 的整数,并以数组形式返回
- 21.3.8. 独一无二的出现次数
- 21.3.9. K 和数对的最大数目
- 22. 树
❱
- 22.1. 基础
❱
- 22.1.1. 树的一些基本概念
- 22.1.2. 二叉树基本概念:Python 描述
- 22.1.3. 二叉树的存储方式
- 22.1.4. 二叉树的遍历:Python 描述
- 22.1.5. 二叉树的遍历: DFS(前中后序遍历)、BFS(层序遍历)
- 22.1.6. 多叉树的遍历: DFS(前中后序遍历)、BFS(层序遍历)
- 22.1.7. 二叉树算法概述
- 22.1.8. 二叉树的两种解题思维
- 22.1.9. 二叉树的分解问题思路
- 22.1.10. 二叉树的前中后序遍历详解
- 22.1.11. 二叉树遍历的迭代解法
- 22.1.12. 多叉树的遍历:Python 描述
- 22.1.13. 二叉树与单链表的关系
- 22.1.14. AVL 树和红黑树 → 都是 BST
- 22.1.15. 其他树结构
- 22.2. 二叉树基础
❱
- 22.2.1. 二叉树的最大深度
- 22.2.2. 二叉树展开为链表
- 22.2.3. 填充每个节点的下一个右侧节点指针
- 22.2.4. 二叉树的前序遍历
- 22.2.5. 二叉树的右视图
- 22.2.6. 完全二叉树的节点个数
- 22.2.7. 二叉搜索树的最近公共祖先:p 和 q 一定在树中
- 22.2.8. 二叉树的最近公共祖先:p 和 q 一定在树中
- 22.2.9. 验证二叉树的前序序列化
- 22.2.10. 扁平化嵌套列表迭代器:惰性展开多叉树
- 22.2.11. 二叉树的直径:左右子树的最大深度之和
- 22.2.12. 叶子相似的树
- 22.2.13. 二叉树的最近公共祖先 II:p 和 q 不一定在树中
- 22.2.14. 二叉树的最近公共祖先 III:包含 parent 指针
- 22.2.15. 二叉树的最近公共祖先 IV:多个节点的最近公共祖先
- 22.2.16. 找到二叉树中的距离:p 到 q 的路径上边的数目
- 22.3. 遍历一遍的思路
❱
- 22.3.1. 二叉树的中序遍历
- 22.3.2. 二叉树的最小深度
- 22.3.3. 路径总和:是否存在根节点到叶子节点的路径和为 target
- 22.3.4. 路径总和 II :找到所有从根节点到叶子节点路径总和等于 target 的路径
- 22.3.5. 求根节点到叶节点数字之和
- 22.3.6. 二叉树的后序遍历
- 22.3.7. 二叉树的所有路径:返回二叉树的所有路径,以a→b的方式
- 22.3.8. 二叉树最长连续序列:所有路径中,求最长连续序列的长度
- 22.3.9. 嵌套列表加权和
- 22.3.10. 嵌套列表加权和 II
- 22.3.11. 字典序排数
- 22.3.12. 左叶子之和
- 22.3.13. 将二叉搜索树转化为排序的双向链表
- 22.3.14. 路径总和 III:不需要从根节点查找,返回满足条件的个数
- 22.3.15. 找树左下角的值:找出该二叉树的 最底层 最左边 节点的值
- 22.3.16. N 叉树的最大深度
- 22.3.17. 另一棵树的子树:root 是否包含 subRoot
- 22.3.18. N 叉树的前序遍历
- 22.3.19. N 叉树的后序遍历
- 22.3.20. 在二叉树中增加一行
- 22.3.21. 路径总和 IV
- 22.3.22. 二叉搜索树的范围和:返回给定区间所有结点的值的和
- 22.3.23. 翻转二叉树以匹配先序遍历:翻转节点后的树的先序遍历顺序是否能够匹配给定的数组顺序
- 22.3.24. 二叉树的垂序遍历
- 22.3.25. 从叶结点开始的最小字符串
- 22.3.26. 二叉树的堂兄弟节点:x 和 y 是否是堂兄弟
- 22.3.27. 从根到叶的二进制数之和
- 22.3.28. 二叉树寻路:之字形状标序号
- 22.3.29. 二叉树着色游戏
- 22.3.30. 最小公共区域
- 22.3.31. 在受污染的二叉树中查找元素
- 22.3.32. 祖父节点值为偶数的节点和
- 22.3.33. 找出克隆二叉树中的相同节点:使用 A 中的 target 去找 B 中对应节点
- 22.3.34. 判断给定的序列是否是二叉树从根到叶的路径
- 22.3.35. 统计二叉树中好节点的数目:
- 22.3.36. 二叉树中的伪回文路径
- 22.3.37. 寻找所有的独生节点
- 22.3.38. 找到二叉树中最近的右侧节点:找到 节点 u 所在层中距离最近的右侧节点
- 22.3.39. 检查两棵二叉表达式树是否等价
- 22.3.40. 从二叉树一个节点到另一个节点每一步的方向
- 22.4. 分解问题的思路
❱
- 22.4.1. 相同的树:判断两个二叉树是否相同
- 22.4.2. 对称二叉树:判断树是否轴对称
- 22.4.3. 二叉树中的最大路径和:不一定经过根节点,可以从左到右边
- 22.4.4. LCR.子结构判断:A 是否包含 B
- 22.4.5. 翻转二叉树:翻转二叉树的两种解题思路
- 22.4.6. 合并二叉树:两个树强强组合
- 22.4.7. 二叉树剪枝:返回移除了所有不包含 1 的子树的原二叉树
- 22.4.8. 翻转等价二叉树:判断这两棵二叉树是否是翻转等价的
- 22.4.9. 二叉树中的链表:二叉树中是否包含某条单链表
- 22.4.10. 克隆 N 叉树
- 22.5. 后序位置
❱
- 22.5.1. 平衡二叉树
- 22.5.2. 统计同值子树
- 22.5.3. 最大二叉搜索子树:给定一个二叉树,找到其中最大的二叉搜索树(BST)子树,并返回该子树的大小
- 22.5.4. 寻找二叉树的叶子节点
- 22.5.5. 出现次数最多的子树元素和
- 22.5.6. 二叉树最长连续序列 II:最长连续的路径
- 22.5.7. 二叉树的坡度:返回整个树的坡度
- 22.5.8. 均匀树划分:能否分成两棵节点值之和相等的子树
- 22.5.9. 最长同值路径:返回边的个数
- 22.5.10. 具有所有最深节点的最小子树
- 22.5.11. 监控二叉树
- 22.5.12. 节点与其祖先之间的最大差值
- 22.5.13. 子树的最大平均值
- 22.5.14. 删除给定值的叶子节点
- 22.5.15. 分裂二叉树的最大乘积:删除 1 条边,使二叉树分裂成两棵子树,且它们子树和的乘积尽可能大
- 22.5.16. 二叉树中的最长交错路径
- 22.5.17. 收集树上所有苹果的最少时间
- 22.5.18. 统计最高分的节点数目
- 22.6. 构造与序列化
❱
- 22.6.1. 从前序与中序遍历序列构造二叉树
- 22.6.2. 从中序与后序遍历序列构造二叉树
- 22.6.3. 将有序数组转换为二叉搜索树
- 22.6.4. 有序链表转换二叉搜索树
- 22.6.5. 二叉搜索树迭代器
- 22.6.6. 二叉树的序列化与反序列化
- 22.6.7. 序列化和反序列化二叉搜索树
- 22.6.8. 从字符串生成二叉树:由包含括号的字符串生成二叉树
- 22.6.9. 根据二叉树创建字符串:二叉树转字符串 → 1(2(4))(3)
- 22.6.10. 最大二叉树:根据一个数组构建最大二叉树
- 22.6.11. 根据前序和后序遍历构造二叉树
- 22.6.12. 所有可能的真二叉树:节点数为 n 的所有满二叉树
- 22.7. 二叉搜索树(BST)
❱
- 22.7.1. 二叉搜索树:Python 描述
- 22.7.2. 二叉搜索树的增删改查模板
- 22.7.3. 不同的二叉搜索树 II:列举 1-n 能构造出的所有BST
- 22.7.4. 不同的二叉搜索树:1-n个数字能构造出多少个 BST
- 22.7.5. 验证二叉搜索树
- 22.7.6. 恢复二叉搜索树:恰好两个节点的值被错误地交换,请修正
- 22.7.7. 二叉搜索树中第 K 小的元素
- 22.7.8. 验证二叉搜索树的前序遍历序列
- 22.7.9. 最接近的二叉搜索树值:二叉搜索树中找到最接近目标值 target 的数值,如果有多个答案,返回最小的那个
- 22.7.10. 二叉搜索树中的中序后继:比 p.val 大的节点中键值最小的节点
- 22.7.11. 删除二叉搜索树中的节点
- 22.7.12. 二叉搜索树中的众数:找出并返回 BST 中的所有出现频率最高的元素
- 22.7.13. 二叉搜索树中的中序后继 II:包含 parent节点
- 22.7.14. 二叉搜索树的最小绝对差:任意两个节点的差值的绝对值最小值
- 22.7.15. 把二叉搜索树转换为累加树:每个节点变成 >= 该节点的所有节点之和
- 22.7.16. 两数之和 IV - 输入二叉搜索树,是否存在
- 22.7.17. 修剪二叉搜索树:通过修剪二叉搜索树,使得所有节点的值在 low~ high 之间
- 22.7.18. 二叉树中第二小的节点:root 总是小于子节点,找第二小的值
- 22.7.19. 二叉搜索树中的搜索
- 22.7.20. 二叉搜索树中的插入操作
- 22.7.21. 拆分二叉搜索树:大于 k 的子树 和 小于 k 的子树
- 22.7.22. 递增顺序搜索树: BST转成单链表
- 22.7.23. 前序遍历构造二叉搜索树:前序位置构造二叉搜索树
- 22.7.24. 从二叉搜索树到更大和树:BST 转化累加树
- 22.7.25. 查找两棵二叉搜索树之和:从两棵BST中各找出一个节点, 满足 2sum = target
- 22.7.26. 两棵二叉搜索树中的所有元素:合并两个 BST,返回有序数组
- 22.7.27. 二叉搜索子树的最大键值和:二叉树的 BST 子树最大和
- 22.7.28. 将二叉搜索树变平衡
- 22.8. 层次遍历
❱
- 22.8.1. 二叉树的层序遍历
- 22.8.2. 二叉树的锯齿形层序遍历:Z 字形遍历
- 22.8.3. 二叉树的层序遍历 II:自底向上的层序遍历
- 22.8.4. 填充每个节点的下一个右侧节点指针 II
- 22.8.5. 将 N 叉树编码为二叉树:可以将 N 叉树编码为二叉树,并能将该二叉树解码为原 N 叉树
- 22.8.6. 在每个树行中找最大值
- 22.8.7. 二叉树的层平均值
- 22.8.8. 二叉树最大宽度
- 22.8.9. 二叉树最近的叶节点:返回树中与目标值 k 最近的叶子节点
- 22.8.10. 二叉树中所有距离为 K 的结点:返回到目标结点 target 距离为 k 的所有结点的值组成的数组
- 22.8.11. 完全二叉树插入器:设计一种算法,将一个新节点插入到一棵完全二叉树中,并在插入后保持其完整
- 22.8.12. 二叉树的完全性检验:判断完全二叉树
- 22.8.13. 最大层内元素和:返回哪一层和最大
- 22.8.14. 层数最深叶子节点的和:返回最后一层的和
- 22.8.15. 找到二叉树中最近的右侧节点:u 节点最近的右侧节点
- 22.8.16. 奇偶树:第 0 层递增,第 1 层递减
- 22.9. 堆
❱
- 22.9.1. 二叉堆
- 22.9.2. 数据结构中的堆和内存中的堆的区别
- 22.9.3. 堆内存和栈内存的区别
- 22.9.4. 二叉堆与优先级队列的关系
- 23. 图
❱
- 23.1. 基本概念:篇一
- 23.2. 基本概念:篇二
- 23.3. 图的实现
- 23.4. 图的 DFS 遍历
- 23.5. 图的 BFS 遍历
- 23.6. 环检测算法:有向图的环检测
- 23.7. 拓扑排序
- 23.8. 二分图
- 23.9. 并查集(Union Find)
- 23.10. 最小生成树: Kruskal 算法
- 23.11. 最小生成树:Prim 算法
- 23.12. Dijkstra 算法
- 23.13. 课程表:是否可能完成所有课程的学习
- 23.14. 课程表 II:返回你为了学完所有课程所安排的学习顺序
- 23.15. 以图判树:判断图是否可以生成树
- 23.16. 搜寻名人:返回名人的编号,不存在返回 -1
- 23.17. 网络延迟时间
- 23.18. 判断二分图:判断一幅图是否是二分图
- 23.19. 所有可能的路径
- 23.20. 可能的二分法:将互相讨厌的人分成两个组
- 23.21. 最低成本连通所有城市
- 23.22. 概率最大的路径
- 23.23. 连接所有点的最小费用
- 23.24. 最小体力消耗路径
- 24. 其他数据结构
❱
- 24.1. 常数时间删除、查找数组中的任意元素
- 24.2. LRU 算法
- 24.3. LFU 缓存
- 25. 搜索与排序
❱
- 25.1. 搜索
❱
- 25.1.1. 二分搜索
❱
- 25.1.1.1. 搜索旋转排序数组:从两个有序组成的数组中找目标值
- 25.1.1.2. 在排序数组中查找元素的第一个和最后一个位置
- 25.1.1.3. 搜索插入位置:有序数组中插入 target,保证有序,返回插入的位置
- 25.1.1.4. 搜索旋转排序数组 II:从两个排序数组中查找目标值,但存在重复元素
- 25.1.1.5. 寻找峰值:峰值元素是指其值严格大于左右相邻值的元素
- 25.1.1.6. LCR.172.统计目标成绩的出现次数
- 25.1.1.7. LCR.点名:从一个升序数组中找出缺失的数字
- 25.1.1.8. 找到 K 个最接近的元素:最靠近 x 的 k 个数
- 25.1.1.9. 二分查找
- 25.1.1.10. 山脉数组的峰顶索引:开口向上的抛物线
- 25.1.2. 搜索算法总结
- 25.2. 排序
❱
- 25.2.1. 排序算法基础:篇一
- 25.2.2. 排序算法基础:篇二
- 25.2.3. 选择排序
- 25.2.4. 冒泡排序
- 25.2.5. 插入排序
- 25.2.6. 快速排序
- 25.2.7. 归并排序
- 25.2.8. 数组中的第K个最大元素
- 25.2.9. H 指数
- 25.2.10. 计算右侧小于当前元素的个数
- 25.2.11. 区间和的个数
- 25.2.12. 翻转对
- 25.2.13. 煎饼排序
- 26. 回溯、DFS、BFS
❱
- 26.1. 回溯算法
❱
- 26.1.1. 回溯算法解题框架
- 26.1.2. 排列、组合、子集问题合集
- 26.1.3. 球盒模型
- 26.1.4. 回溯算法解数独
- 26.1.5. 回溯算法解括号生成
- 26.1.6. 划分为 k 个相等的子集
- 26.1.7. SKU 排列
- 26.1.8. 电话号码的字母组合
- 26.1.9. 根据传入的值 n,生成所有小于 n 的二进制
- 26.1.10. 组合总和 II :元素可重,不可复选
- 26.1.11. 全排列:元素不可重复,不可复选
- 26.1.12. 全排列 II:元素可重复,不可复选
- 26.1.13. 组合:元素不重复不可复选
- 26.1.14. 子集:元素不重复不可复选
- 26.1.15. 子集 II:元素重复,不可复选
- 26.1.16. 复原 IP 地址
- 26.1.17. 单词拆分 II:加空格生成多少种句子
- 26.1.18. 连续差相同的数字
- 26.2. DFS
❱
- 26.2.1. 回溯算法与DFS算法的区别
- 26.2.2. 二维矩阵遍历框架
- 26.2.3. 岛屿数量
- 26.2.4. 除法求值:货币兑换
- 26.2.5. 省份数量
- 26.2.6. 不同岛屿的数量:形状不同的岛屿
- 26.2.7. 岛屿的最大面积:半岛也算
- 26.2.8. 钥匙和房间
- 26.2.9. 统计封闭岛屿的数目:全岛的数量
- 26.2.10. 重新规划路线
- 26.2.11. 统计子岛屿:grid2 被 grid1包含多少个岛屿?
- 26.3. BFS
❱
- 26.3.1. BFS 算法框架
- 26.3.2. 双向 BFS 优化
- 26.3.3. 杀掉进程
- 26.3.4. 打开转盘锁
- 26.3.5. 滑动谜题
- 26.3.6. 腐烂的橘子
- 26.3.7. 迷宫中离入口最近的出口
- 27. 动态规划
❱
- 27.1. 动态规划
❱
- 27.1.1. 斐波那契数列
- 27.1.2. 动态规划解题套路框架:以最小零钱为例说明
- 27.1.3. 如何查找状态转移方程:最长递增子序列与俄罗斯套娃
- 27.1.4. base case 和备忘录的初始值怎么定:下降路径的最小和
- 27.1.5. 最优子结构原理 和 DP 数组遍历方向
- 27.1.6. 动态规划穷举的两种视角:不同的子序列个数
- 27.1.7. 动态规划和回溯算法:单词拆分与单词拆分 II
- 27.1.8. 对动态规划进行空间压缩
- 27.1.9. 子序列:最小编辑距离
- 27.1.10. 子序列:最大子数组
- 27.1.11. 子序列:最长公共子序列问题
- 27.1.12. 子序列: 动态规划之子序列问题解题模板(最长回文子序列)
- 27.1.13. 背包:0-1 背包问题
- 27.1.14. 背包:数组是否可以分割两个子集,使得这两子集的元素和相等
- 27.1.15. 完全背包问题:零钱兑换
- 27.1.16. 背包问题:目标和
- 27.1.17. 地下城游戏
- 27.1.18. 最小路径和
- 27.1.19. 不同的子序列: s 的子序列中 t 出现的个数
- 27.1.20. 买卖股票的最佳时机
- 27.1.21. 买卖股票的最佳时机 II
- 27.1.22. 单词拆分:给定的字符串是否能由给定的单词集合组合成
- 27.1.23. 买卖股票的最佳时机 IV
- 27.1.24. 最长递增子序列:最长递增子序列数量
- 27.1.25. 零钱兑换:需要的最小硬币数
- 27.1.26. 俄罗斯套娃信封问题:最长子序列的二维版本
- 27.1.27. 下降路径最小和:从第一行下降到最后一行最小路径合为多少?
- 27.2. 贪心算法
❱
- 27.2.1. 贪心算法:区间调度问题
- 27.2.2. 跳跃游戏 II
- 27.2.3. 跳跃游戏
- 28. 其他
❱
- 28.1. 数学运算
❱
- 28.1.1. 字符串乘法计算
- 28.1.2. 反直觉的概率问题
- 28.1.3. 丑数 II
- 28.1.4. 字符串的最大公因子
- 28.2. 其他算法
❱
- 28.2.1. 区间问题
- 28.2.2. 阶乘算法题
- 28.2.3. 一行代码就能解决的算法题
- 28.2.4. 完美矩阵
- 28.2.5. 分割数组为连续子序列:斗地主的顺子
- 28.2.6. 为运算表达式设计优先级
- 28.2.7. 丑数问题
- 28.2.8. 常见的随机算法
- 28.2.9. 如何同时寻找缺失和重复的元素
- 28.2.10. 判断一个数是否是素数
- 28.2.11. 位运算技巧
- 28.2.12. 其他技巧总结
- 28.2.13. 只出现一次的数字
- 28.2.14. 位1的个数
- 28.2.15. 2 的幂:判断一个数是不是 2 的指数
- 28.2.16. 丢失的数字
- 第五部分 计算机科学
- 29. 前言
- 30. Python 编程语言
❱
- 30.1. Python 语言基础
- 30.2. Python 函数与模块
- 30.3. Python 类
- 30.4. Python 文件与异常处理
- 31. 计算机网络篇
❱
- 31.1. 关于HTTP 的一些常见问题汇总
- 31.2. 常见的几种 POST 数据提交方式
- 31.3. 幂等与非幂等、HTTP 常见状态码
- 31.4. 本地配置 SSH
- 32. 数据库
❱
- 32.1. 数据库事务(Transaction)的概念和重要性
- 33. 其他
❱
- 33.1. 最常见的开源协议
- 第六部分 产品
- 34. 前言
- 35. XaaS
- 关于