标签: 算法

49 个内容

笔记(44)

本文介绍LeetCode二进制手表问题解法。**背景**:手表4小时灯+6分钟灯,亮灯总数为turnedOn。**关键问题**:枚举有效时间并统计二进制1个数。**主要方案**:直接遍历12×60组合,使用`toString(2).split('1').length-1`或`n&(n-1)`位运算计数1,格式化输出时间。回溯法为进阶。

Elliot Yang·
31 浏览

本文针对统计字符串所有子串中元音字母总数的问题,提出了一个高效的解决方案。传统方法复杂度过高,本文通过数学推导,得出每个元音的贡献值为 `(i+1) * (n-i)`,其中 i 是元音的下标,n 是字符串长度。最终,只需一次遍历即可得到答案,时间复杂度为 O(n)。

Elliot Yang·
101 浏览

本文深入探讨了平方根函数的多种实现方案,包括牛顿迭代法、二分查找法,以及IEEE 754标准下的精度优化。同时,讨论了CPU指令级和向量化硬件加速方法,分析了误差来源与数值稳定问题,并展望了未来发展方向。强调应根据实际需求权衡精度、性能和复杂度。

Elliot Yang·
129 浏览

本文深入探讨递归的三种形态:记忆化、分治和回溯。记忆化通过缓存避免重复计算,分治分解问题递归解决再合并,回溯是带剪枝的深度优先搜索。讨论了递归与迭代的效率,给出工程实践建议和调试技巧,并扩展到分布式系统和机器学习的应用。

Elliot Yang·
102 浏览

KMP算法通过前缀函数优化字符串匹配,避免暴力匹配的回溯。核心是next数组,记录模式串已匹配部分的最长公共前后缀长度,加速匹配过程。工程实践需注意next数组构建、Unicode处理及优化,如批量跳转和缓存预取。

Elliot Yang·
142 浏览

本文深度解析了前端开发中的关键算法与原理,涵盖字符串处理、类型系统、位运算、动态规划、随机算法、二叉树遍历、JavaScript浮点数精度等。重点包括路径字符串转对象、字母异位词判断、类型柯里化、汉明距离计算、水塘抽样等经典问题,并探讨了工程实践和进阶思考。

Elliot Yang·
90 浏览

本文深入解析二分查找,从基础实现到左右边界查找,强调循环不变量和边界处理。探讨了时间复杂度O(log n)和空间复杂度O(1)的优化,以及工程实践技巧。同时,分析了三数之和问题的双指针解法及优化,并介绍了前沿研究和工业应用,例如数据库索引和版本控制。

Elliot Yang·
124 浏览

堆是满足堆序性质的完全二叉树,常用数组实现。核心操作优化包括插入的`heapifyUp`修正和删除的空堆检测。应用广泛,如优先队列和Top K问题。优化手段包括Floyd建堆法和TypedArray。存在二叉堆、斐波那契堆等变体,面临并发、内存管理等挑战。未来趋势包括持久化堆和GPU加速。

Elliot Yang·
124 浏览

二叉树是重要的树形结构,包括满二叉树、完全二叉树和二叉搜索树。二叉搜索树在平衡时性能最佳,不平衡时退化。AVL树通过旋转保持平衡,查询性能优于普通二叉搜索树。红黑树、Treap和B树等新型结构适用于不同场景。序列化和优化是实际应用中的关键问题。

Elliot Yang·
101 浏览

图数据结构是强大的非线性模型,由顶点和边构成,可分为无向图、有向图和加权图等。存储方式有邻接矩阵和邻接表,适用于不同场景。图算法包括BFS、DFS、最短路径和最小生成树等。工程实践中面临性能优化和实时更新挑战。GNN和量子图计算是前沿方向。需注意循环引用、内存溢出和负权边等问题。

Elliot Yang·
96 浏览

本文深入解析九大排序算法,从基础排序到分治、堆、线性排序,探讨其原理、优化及适用场景。强调算法选型需权衡时空复杂度、稳定性等因素,并结合具体案例分析常见陷阱及解决方案。

Elliot Yang·
159 浏览

链表反转是数据结构基础,涉及指针操作、递归思维。本文解析了双指针迭代(O(1)空间)和递归(O(n)空间)两种主流方案,对比优劣并探讨工程实践要点及进阶问题,强调生产环境优先选择迭代法。

Elliot Yang·
91 浏览

快速排序是基于分治法的经典算法,平均时间复杂度O(N log N)。工程实践中,Lomuto和Hoare是常见分区策略,但需考虑随机化主元、三向切分等优化。迭代实现可避免栈溢出,现代优化包括混合排序、并行化、内存访问优化。选择合适策略需基准测试和内存分析。

Elliot Yang·
128 浏览

算法复杂度分析是工程师的核心技能,涵盖时间与空间复杂度。Big O notation描述函数增长上界,如O(1)、O(log n)、O(n)等。工程实践需考虑常数因子、缓存和空间换时间。前沿趋势包括量子计算影响、近似算法与异构计算优化。最终目标是编写高效代码,避免性能问题。

Elliot Yang·
173 浏览

本文深入剖析了DFS和BFS算法,强调其工程实践及优缺点,并以React Fiber架构为例,阐述了将DFS迭代化、可中断的渲染机制。讨论了算法选择的工程哲学,性能优化及未来趋势,体现了算法与架构设计的共鸣。

Elliot Yang·
93 浏览

本文深入解析回溯算法在数独求解中的应用,强调约束满足问题建模、DFS+剪枝框架,并探讨剪枝、数据结构等优化策略。针对递归深度、多解等工程挑战,提出迭代回溯、并行处理等方案。对比多种算法,强调预处理、早返回、缓存等最佳实践,并展望深度学习在数独求解中的新进展。

Elliot Yang·
178 浏览

本文深入解析 Rust 二叉堆实现,涵盖数学本质、工程优化和工业级特性。重点包括泛型、迭代优化、内存布局、动态调整、性能测试、线程安全及常见问题解决。探讨了标准库BinaryHeap的优化策略及未来演进方向,如并行堆、持久化堆和GPU加速堆。

Elliot Yang·
127 浏览

Rust 通过哈希表高效解决 "Sum of Unique Elements" 问题。代码利用迭代器链、Entry API 和惰性求值,统计元素频率,过滤唯一值并求和。文章还讨论了性能优化、所有权问题、哈希碰撞攻击及跨语言实现,强调基准测试、防御性编程和文档注释的重要性。

Elliot Yang·
88 浏览

本文以Rust语言探讨括号生成问题,核心为回溯算法,通过剪枝优化搜索。对比了clone和可变引用两种实现,后者内存效率更高。分析了时间/空间复杂度,并提出预分配内存、迭代法等优化策略。强调Rust所有权管理,并展望了并行化、形式化验证等前沿方向。

Elliot Yang·
99 浏览

车队问题建模为运动学相遇,核心在于计算车辆到达时间并排序。按位置降序后,利用单调栈思想,O(n) 遍历即可确定车队数量。算法关键是逆向思维和时间单调性,总复杂度 O(n log n)。工程实现需注意浮点数精度和排序算法选择。

Elliot Yang·
99 浏览

本文深入解析了 Rust 链表反转,强调了内存模型、所有权系统和工程实践。阐述了 Rust 中链表节点的设计,对比了智能指针的选择,剖析了经典反转算法,并探讨了安全操作、测试、并发、性能优化等实践要点,以及未来发展方向。

Elliot Yang·
122 浏览

最长回文子串问题寻找字符串中最长对称连续子序列,动态规划解法通过状态转移方程和空间优化求解,但内存占用高;中心扩散法空间复杂度低,适合内存受限场景。Manacher算法可实现线性时间复杂度,工程实践需权衡算法优劣,未来发展方向包括量子计算加速和硬件加速。

Elliot Yang·
115 浏览

本文深入探讨前端核心技术与算法实现,涵盖微前端架构(组合式集成、路由分发等模式)、二叉树最小路径和优化(动态规划、记忆化)、Promise A+规范实现与数组扁平化工程化方案。并提供实践建议和性能优化策略。

Elliot Yang·
88 浏览

本文介绍了动态规划在解决最长回文子串问题中的应用。针对该问题,提供了两种解法:一种使用动态规划构建二维数组记录所有子串的回文状态,另一种采用中心扩散法,以每个字符为中心向外扩展。前者时空复杂度均为O(n^2),后者时间复杂度为O(n^2),空间复杂度为O(1)。

Elliot Yang·
104 浏览

本文介绍了使用 Rust 反转链表的算法实现。针对链表反转问题,文章给出了 Rust 代码示例,并详细解释了代码中 `Box` 的作用,以及为何在链表数据结构中必须使用 `Box`。同时,对比了 `Box` 和 `Rc<RefCell<T>>` 的区别,并通过单元测试验证了代码的正确性。还解释了`take`、`as_mut`、`as_ref`、`unwrap`等方法的使用和所有权问题。

Elliot Yang·
99 浏览

本文介绍了解决 Car Fleet 问题的 Rust 代码实现。问题背景是计算到达相同目的地的车队数量,关键在于理解车队的概念:即以相同速度和位置行驶的车辆集合。解决方案是计算每辆车到达目的地的时间,排序后,如果后续车辆到达时间大于当前车队,则形成新的车队。

Elliot Yang·
92 浏览

本文介绍了使用 Rust 解决生成有效括号组合的问题。通过回溯算法,递归生成所有可能的括号组合,并利用变量所有权机制避免编译错误。关键点在于使用 `clone()` 保证变量在多次递归调用中的可用性。

Elliot Yang·
92 浏览

本文介绍了求解数组中唯一元素和的问题。分别使用 Rust 和 TypeScript 两种语言,通过 Hashmap 统计数组中每个元素的出现次数,然后过滤出只出现一次的元素并求和。Rust 解法中使用了 `fold` 和 `filter_map` 方法。

Elliot Yang·
98 浏览

本文介绍了使用 Rust 实现二叉堆(MinHeap)的数据结构。利用 Rust 的 Vector 作为底层存储,实现了`push`(上浮)和 `pop`(下沉)操作来维护堆的完全二叉树和堆性质。代码示例展示了最小堆的实现细节,包括`bubble_up`和`bubble_down`算法。

Elliot Yang·
103 浏览

本文介绍了使用回溯算法解决数独问题。回溯算法是一种试探搜索型算法,通过深度优先搜索策略,从可能的选项中选择一个,若无法得出正确解则回退一步,选择其他选项。在数独中,即从左上角空格开始,尝试填入数字,若无法填入则回溯到上一个空格,更改其值,直至找到解决方案或确定无解。

Elliot Yang·
90 浏览

本文对比了图遍历算法DFS和BFS。DFS的优点是空间复杂度低、能快速找到解,但可能非最优、易死循环;BFS能找到最短路径、遍历所有可达节点,但空间复杂度高、不适合带权重图。此外,文章还提及React Fiber使用了类似的单链表树遍历算法。

Elliot Yang·
88 浏览

Trie树(字典树)是一种用于高效字符串操作的数据结构,应用于自动补全、拼写检查等。核心操作包括插入、查询、删除和前缀查询,时间复杂度为O(m),m为字符串长度。为解决空间复杂度问题,可采用压缩或优化结构。文章还包含Rust代码示例。

Elliot Yang·
103 浏览

本文介绍了算法时间复杂度的概念,并通过代码示例展示了常见的复杂度等级,包括O(1)、O(log n)、O(n)、O(n log n)、O(n^2)和O(2^n),以及对应的算法实现,如二分查找、归并排序、冒泡排序和斐波那契数列。

Elliot Yang·
88 浏览

本文详解快速排序算法,该算法基于分治策略,通过选取主元并划分数组实现排序。文章讨论了主元选择策略(如随机主元、三数取中),并给出了TypeScript迭代版本的实现。传统递归快排存在堆栈溢出风险,迭代版本通过栈模拟解决了该问题。

Elliot Yang·
105 浏览

本文探讨了反转链表问题。针对该问题,文章提供了两种解决方案:递归和双指针。递归方案的关键在于确定基本情况,而双指针方案则通过迭代改变节点指向来反转链表。文章给出了对应 TypeScript 代码示例。

Elliot Yang·
144 浏览

本文总结了常见的排序算法,包括选择排序、冒泡排序、插入排序、快速排序、堆排序、归并排序、计数排序和桶排序。针对每种算法,文章简述了其原理,并提供了 TypeScript 代码实现。这些算法在时间复杂度、空间复杂度和适用场景上各有特点。

Elliot Yang·
142 浏览

图是一种由顶点和边组成的非线性数据结构。顶点也称为节点,边是连接图中任意两个节点的线或弧。图由顶点集合(V)和边集合(E)组成,表示为G(E, V)。

Elliot Yang·
96 浏览

本文介绍了二叉树的基本概念和几种特殊类型的二叉树,包括完全二叉树、满二叉树、二叉搜索树和AVL树。讨论了它们的定义、性质和节点关系,以及在连续存储方式下的节点下标关系。重点在于理解不同类型二叉树的特性和适用场景。

Elliot Yang·
102 浏览

本文介绍了堆这种特殊的树形数据结构,它是一种基于数组的完全二叉树,常用于实现优先级队列。堆分为最大堆和最小堆,分别保证根节点为最大值或最小值。文章提供了最大堆的 TypeScript 实现,包括插入元素和弹出元素的 `heapifyUp` 和 `heapifyDown` 操作。

Elliot Yang·
142 浏览

本文总结了二分查找的常见写法。针对查找单个目标值、查找左侧边界、查找右侧边界三种场景,分别给出了 JavaScript 代码示例,并分析了搜索区间的选择和边界收缩的策略。此外,还展示了二分查找在“最接近的三数之和”问题中的应用。

Elliot Yang·
105 浏览

本周报主要内容包括:1. 探讨了 `vertical-align` 的 `Line-relative values` 和 `Parent-relative values` 的区别。2. 总结了 `scrollIntoView` 的使用方法和参数选项。3. 提供了树结构和列表互相转换的 JavaScript 实现。

Elliot Yang·
122 浏览

本文是为面试准备的礼物,汇总了常见的JS手写题和八股文。手写题包括字符串转换对象、类型体操科里化、汉明距离总和、股票买卖、链表随机节点、二叉树迭代遍历、整数转罗马数字、字母异位词分组等。重点讨论了JS浮点数运算不精确的原因和解决方法,涉及IEEE 754标准、精度丢失等,并解释了Number.MAX_SAFE_INTEGER等特殊值。

Elliot Yang·
98 浏览

本文介绍了KMP字符串匹配算法,旨在解决朴素匹配算法效率低下的问题。核心在于利用前缀表(next数组)记录模式串的最长相同前后缀,从而在匹配失败时快速跳转,实现O(n+m)的时间复杂度。文中详细解释了next数组的计算方法和应用。

Elliot Yang·
108 浏览

本文探讨递归的三种形式:记忆化、分治和回溯。重点讲解回溯法,用于解决N个for循环问题,通过试错和剪枝优化进行暴力搜索,并给出经典例题及代码示例。同时分析了JS中递归与迭代的效率问题,通常迭代效率更高。

Elliot Yang·
113 浏览

动态(5)

E
Elliot Yang
公开

基于最近的感受基本上不做题的公司都是比较拉的

勤劳的码师傅早早起来,打开leetcode开始 做今天的简单题, 经过他的不懈努力,终于 在4小时后打开了题解。--来自扣友
浏览:159点赞:0
E
Elliot Yang
公开

那些留在2023年的日子:五月

  • Docker 多阶段构建
  • TypeScript namespace 的妙用,在生成模版代码的时候可以免导入,直接使用 namespace 获取
  • BFS 和 DFS 的优缺点,fiber 为什么选择 DFS
浏览:154点赞:0
E
Elliot Yang
公开

2022-10-21 日报

浏览:134点赞:0
E
Elliot Yang
公开

2022-10-19 日报

浏览:136点赞:0
E
Elliot Yang
公开

A Bloom filter is a data structure designed to tell you, rapidly and memory-efficiently, whether an element is present in a set.

The price paid for this efficiency is that a Bloom filter is a probabilistic data structure: it tells us that the element either definitely is not in the set or may be in the set.

浏览:139点赞:0