
算法
文章平均质量分 79
comli_cn
算法工程师,微信公众号:李歪理
展开
-
KMP算法
假设我们已经生成了 next 数组,原创 2025-01-01 23:07:02 · 379 阅读 · 0 评论 -
leetcode 3224. 使差值相等的最少数组改动次数
从题目的提示内容可知数组中的数在 0-k 之间,又因为 数组中的数字可以修改为 0-k之间的任意数,所以直接上 X 的取值范围为 0原创 2024-12-11 16:52:46 · 700 阅读 · 0 评论 -
回文串相关算法的总结
这是一个奇妙的算法,是1957年一个叫Manacher的人发明的,所以叫Manacher‘s Algorithm,主要是用来查找一个字符串的最长回文子串,这个算法最大的贡献是将时间复杂度提升到线性,前面我们说的动态规划的时间复杂度为 O(n。),而是 O(n),因为绝大多数索引位置会直接利用前面的结果以及对称性获得结果,常数次就可以得到结果,而那些需要中心拓展的,是因为超出前面结果覆盖的范围,才需要拓展,拓展所得的结果,有利于下一个索引位置的计算,因此拓展实际上较少。假设字符串的长度为 n。原创 2024-12-07 14:19:22 · 966 阅读 · 0 评论 -
前缀和&差分
前缀和可以简单理解为「数列的前 n 项的和」,是一种重要的预处理方式,能大大降低查询的时间复杂度。常见的多维前缀和的求解方法有两种。这种方法多用于二维前缀和的情形。给定大小为m×n的二维数组 A,要求出其前缀和 S。那么,S 同样是大小为m×n的二维数组,且Sij∑i′≤i∑j′≤jAi′j′类比一维的情形,Sij应该可以基于Si−1j或Sij−1计算,从而避免重复计算前面若干项的和。但是,如果直接将S。原创 2024-12-06 10:53:12 · 834 阅读 · 0 评论 -
最短编辑距离和最短编辑路径
1. 题目求出两个字符串的最短编辑距离,及最短编辑路径。2. 代码# 计算两个字符串的最小编辑距离def min_ed(source_str, target_str, source_len, target_len): # 初始化matrix matrix = [] for i in range(source_len + 1): matrix.append([]) for j in range(target_len + 1):原创 2022-05-02 18:45:43 · 950 阅读 · 0 评论 -
变分模态分解(VMD)运算步骤及源码解读
1. 简述VMD的目标是将实值输入信号fff分解为离散数量的子信号(模态) uku_kuk 。我们先假设每个模态在一个中心频率ωk\omega_kωk周围是紧密的,也就是说这个模态包含的频率分量都在ωk\omega_kωk附近,而ωk\omega_kωk是随着分解来确定。为了评估一个模态的带宽,提出以下方案:1)对于每个模态,通过希尔伯特变换计算相关的分析信号,以便获得单向频谱。2)对于每种模态,通过与调谐到相应估计中心频率的指数混频,将模态的频谱移至“基带”。3)现在通过解调信号的高斯平滑度原创 2021-09-05 16:27:21 · 29851 阅读 · 18 评论 -
蓄水池抽样
1. 蓄水池的容积为1(1)问题如何随机从n个对象中选择一个对象,这n个对象是按序排列的,但是在此之前你不知道n的值?(2)算法与证明算法:我们先将第一个对象作为备选放入蓄水池,也就是说第一个对象被放入蓄水池的概率为1,以1/21/21/2的概率选择第二个,以1/31/31/3的概率选择第三个,以此类推,以1/m1/m1/m的概率选择第m个对象。当该过程结束时,每一个对象具有相同的选中概率,即1/n1/n1/n。证明:第m个对象最终被选中的概率P=选择m的概率*其后面所有对象不被选择的概率,即P原创 2021-08-03 15:06:49 · 243 阅读 · 0 评论 -
反转链表
1. 反转一个单向链表题目:反转一个单链表示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL解题:用递归反转的方法来反转一个单链表核心代码:def reverse(self, head): if head.next == None: return head last = self.reverse(head.next) head.next.next = head hea原创 2020-10-07 11:27:45 · 105 阅读 · 0 评论 -
各种背包问题原理,例题,代码实现
1. 0/1背包1.1 问题描述一个旅行者有一个容量为V的背包,现在有N件物品,它们的价值分别是 W1 ,W2 ,… , Wn ,它们所要占用的容量分别为 C1,C2 ,… ,Cn 。若每种物品只有一件求旅行者能获得最大总价值。1.2 基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即 F [i; v] 表示前 i 件物品恰放入一个容量为 v 的背包可以获得的最大价值。则其状态转移方程便是:这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它原创 2020-08-12 15:27:59 · 2031 阅读 · 0 评论 -
牛客:华为机试---人民币转换
1. 题目描述考试题目和要点:1、中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样填写。(30分)2、中文大写金额数字到“元”为止的,在“元”之后,应写“整字,如¥ 532.00应写成“人民币伍佰叁拾贰元整”。在”角“和”分“后面不写”整字。(30分)3、阿拉伯数字中间有“0”时,中文大写要写“零”字,阿拉伯数字中间连续有几个“0”时,中文大写金额中间只写一个“零”字,如¥6007.14,应写成“人民币陆仟零原创 2020-08-09 10:23:55 · 701 阅读 · 0 评论 -
数组的相关算法题
1. 螺旋矩阵描述:给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。示例:输入: 3输出:[[ 1, 2, 3 ],[ 8, 9, 4 ],[ 7, 6, 5 ]]解题思路:模拟螺旋矩阵的生成方式,即先按照顺序在第一行从左到右生成,然后在最后一列从上到下生成,然后在最后一列从右到左生成,然后在第一列从下到上生成,彼此之间不能有交叉。但这样只能生成最外层的数,要想完整地生成矩阵我们可以每生成一整行或者一整列就把这一整行或一整列去掉,只对原创 2020-07-31 10:56:23 · 373 阅读 · 0 评论 -
从递归到记忆化搜索再到动态规划(原理+编程实例)
0. 概念将原问题拆解成若干子问题,同时保存子问题的答案,使得每个子问题只求解一次,最终获得原问题的答案。这个概念听起来跟带记忆的递归(即记忆化搜索)是一样的,其实本质上就是相同的,如果要分清楚的话可以参考下图。都是用于解决递归问题,且都能够避免重复计算重叠子问题,不同之处在于记忆化搜索是自顶向下解决问题的,而动态规划是自底向上解决问题的。1.斐波那契数列在递归和带记忆的递归(原理和例子)这篇博文中我们讨论了计算斐波那契数列的普通递归方法和加了记忆的递归方法(即记忆化搜索),这里接着讨论如何使用动原创 2020-06-19 22:16:09 · 371 阅读 · 0 评论 -
递归和带记忆的递归(原理和例子)
0. 递归和带记忆的递归当原问题和它的子问题的形式以及解题思路一样的时候就可以使用递归来解决,但是递归会发生重复计算的问题,如果递归的深度过深的话会使计算时间大大增加,所以引入了带记忆的递归。带记忆的递归会记住已经计算过的递归路径,当程序再次访问这个路径的时候会直接获得返回值而不需要一层层往下计算。1.斐波那契数列斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-原创 2020-06-18 16:13:35 · 1449 阅读 · 1 评论 -
回溯算法的原理和实现步骤
1.原理回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。2.操作也就是说解决一个回溯问题,实际上就是一个决策树的遍历原创 2020-06-06 10:31:28 · 7133 阅读 · 0 评论