![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法学习笔记
wweTHEUT
这个作者很懒,什么都没留下…
展开
-
二维网格迁移
代码】二维网格迁移。原创 2022-07-20 22:40:41 · 184 阅读 · 1 评论 -
下一个更大元素 III
代码】下一个更大元素III。原创 2022-07-16 12:13:06 · 196 阅读 · 0 评论 -
粉刷房子(leetcode)
深度优先搜索和动态规划原创 2022-06-26 08:26:28 · 123 阅读 · 0 评论 -
串联所有单词的子串
采用散列表和动态规划,中间查找相同的字符串可以适当优化(我这里没优化但能够通过)。原创 2022-06-24 07:12:47 · 220 阅读 · 0 评论 -
关于破碎矩形区域按照均匀分布随即选点的问题
随机选点在游戏和统计中用的非常多,怎么利用伪随机算法在计算机中模拟现实中符合特定分布特征的点,则一般需要用到概率论中的知识进行建模,从古典概型到现代多样概率分布函数以及特征数,都可以成为建立符合要求的伪随机算法的工具。一生二二生三三生万物道法自然,构建符合特定分布的伪随机算法不是推倒重来,而是可以在均匀分布的伪随机算法基石之上堆彻出鳞次栉比的伪随机算法大厦。伪随机算法发展至今,已经发明出数种相对可靠的算法,比如在计算机程序语言中通常自带的LCG算法以及基于LCG扩展的MWC算法再到位运算LFSR算法然后原创 2022-06-09 12:32:39 · 275 阅读 · 0 评论 -
我的日程安排表 III
有序结合的思想,实际可以运用线段树解决能减少不少代码原创 2022-06-06 19:05:11 · 83 阅读 · 0 评论 -
状态压缩+减枝
这里自己能够想到的是状态压缩+剪纸以及回溯,至于动态规划个人直觉上有但是没有想出来。原创 2022-06-01 22:58:35 · 99 阅读 · 0 评论 -
leetcode笔记(剑指 Offer II 114. 外星文字典)
题目来自leetcode可以采用回溯代换数字,然后进行数字排序,也可以直接采用拓扑排序,回溯代换数字的代码结构要比拓扑排序的复杂且复杂度要高,不过针对数据量少的数据集还是可以用的。原创 2022-05-31 22:29:38 · 1284 阅读 · 0 评论 -
验证IP地址
有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 <= xi <= 255 且 xi 不能包含 前导零。例如: “192.168.1.1” 、 “192.168.1.0” 为有效IPv4地址, “192.168.01.1” 为无效IPv4地址; “192.168.1.00” 、 “192.168@1.1” 为无效IPv4地址。一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8” 的IP地址,其中:1 <= xi.len原创 2022-05-29 10:58:33 · 1359 阅读 · 0 评论 -
环绕字符串中唯一的子字符串
一、问题把字符串 s 看作是 “abcdefghijklmnopqrstuvwxyz” 的无限环绕字符串,所以 s 看起来是这样的:"...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....".现在给定另一个字符串 p 。返回s 中唯一 的 p 的 非空子串的数量。输入: p = "cac"输出: 2解释: 字符串 s 中的字符串“cac”只有两个子串“a”、“c”。.来源:力扣(LeetCode)...原创 2022-05-25 22:45:24 · 104 阅读 · 0 评论 -
leetcode(为高尔夫比赛砍树)
求两点之间最短路径,个人平常用的最多的是floyd算法,算法相当简洁,写起来也方便,但是这里的格点比较多,不适合floyd,而对于dijkstra算法,当树接节点占满图后,直接退化成floyd算法,时间复杂度也变得不是很理想,这里用A* (求路径有各种各样的算法,有A*的变种,也有些对于实时度较高的甚至采用蚁群算法,这是个很复杂的领域,无人驾驶,导航,路由,加速器,都用到路径规划,但针对某一特定问题选择的算法都会不同。):var cutOffTree = function(forest) {...原创 2022-05-24 00:29:11 · 118 阅读 · 0 评论 -
数组中重复的数据
问题给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/find-all-duplicates-in-an-array代码var findDuplicates = fun原创 2022-05-08 20:11:46 · 397 阅读 · 0 评论 -
【leetcode】最小基因变化
题目基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 'A'、'C'、'G' 和 'T' 之一。假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。例如,"AACCGGTT" --> "AACCGGTA" 就是一次基因变化。另有一个基因库 bank 记录了所有有效的基因变化,只有基因库中的基因才是有效的基因序列。给你两个基因序列 start 和 end ,以及一个基因库 bank ,请你找出原创 2022-05-07 14:05:02 · 1144 阅读 · 0 评论 -
乘积小于 K 的子数组
给你一个整数数组nums和一个整数k,请你返回子数组内所有元素的乘积严格小于k的连续子数组的数目。var numSubarrayProductLessThanK = function(nums, k) { var ans = 0; let start = 0; let end = 0; let count = 0; let cur_m = 1; while(end < nums.length) { if(nums[...原创 2022-05-06 06:41:27 · 232 阅读 · 0 评论 -
leetcode(点燃木棒)
一、问题二、分析 这个跟在图上找寻每个节点到各个节点之间的最短路径相同,可以利用弗洛伊德算法,不过时间复杂度过高,为此由于问题的特殊性可以采用BFS获得DFS + 记忆搜索,这里只写出用弗洛伊德算法写出的代码。另外就是棍子编号和端点编号的转换问题,这个可以自己去推导,我直接写上了。三、代码 /** * @param {number} height * @param {number} width * @param {number[]} indices * @return原创 2022-04-24 18:49:50 · 202 阅读 · 0 评论 -
leetcode(相邻字符不同的最长路径)
一种方法是中序遍历加上前序遍历构成两组字符串,然后找到的字符串中最长连续的不含相同字符的子字符串便是该树上最长的不同字符路径。原创 2022-04-21 22:36:09 · 566 阅读 · 0 评论 -
从给定原材料中找到所有可以做的菜【算法题】
二、一些思考最让人想到的就是拓扑排序,不过这种问题在高级语言中通常都可以直接用暴力的方法得到。另外,单纯就这道题的解决方法可以解决很多现实中的问题。比如餐厅原料订购与本餐厅菜谱之间的匹配问题,工厂生产中产品与原料的匹对问题,这些都是在日常后勤中所应用的,不过通常都会带上权重。尤其在原材料和产品都比较多的情况下,利用计算机解决可以提高工作效率。这些在仓库管理系统中也是常应用到的。仓库的职责通常来说就是采购、出料与产品入库,而当工厂生产产品多时,如何就当前生产计划以及现有原料库存量推算出预采购原料量..原创 2021-12-28 21:53:25 · 245 阅读 · 0 评论 -
算法不是套模板,而是具体问题具体对策
一、题目二、代码:/** * @param {string} street * @return {number} */var minimumBuckets = function(street) { let result = 0; let index = -1; let prev_index = index; street[-1] = 'o'; let shared = -1; while(true) { prev_i.原创 2021-12-18 17:14:42 · 339 阅读 · 0 评论 -
记一次leetcode绕弯弯
一、问题分析这道题目虽然是简单题,不过这有点像是脑筋急转弯,一不小心就会掉进坑里。如果按照常规思维,这道问题就只能枚举了,可是最终枚举的效果却是时间超时。但只要稍加思考此问题便能发现,既然是k个子序列,那么这k个子序列必然是这序列里的任意组合,那么可想而知一定存在着k个组合,而这k个组合分别是这个数组中前k大的数。那么问题就直接转换成求数组中前k个大的数了。第一种超时办法:/** * @param {number[]} nums * @param {number} k * ...原创 2021-12-16 01:12:59 · 3475 阅读 · 0 评论 -
记一次网吧leetcode
一、题目描述给你两个二进制字符串,返回它们的和(用二进制表示)。输入为非空字符串且只包含数字1和0。二、代码/** * @param {string} a * @param {string} b * @return {string} */var addBinary = function(a, b) { let alen = a.length - 1; let blen = b.length - 1; let addn = 0;...原创 2021-09-16 14:34:46 · 91 阅读 · 0 评论 -
使二进制字符串字符交替的最少反转次数
一、问题二、问题分析这问题跟之前交换二进制字符串挺像的,刚开始想当然以为类型二和那个问题一样,结果后来仔细一看这道题要比那道的操作步骤简单多了。问题抽象化:我们将字符串设为[1...n],现在的问题是求出这个字符串的最少变更次数。而第一步操作可以描述为:从[1...n]中选取[1...k]附加到[k+1...n]后面,即[k+1...n,1...k],我们发现中间部位[k+1...n]是不变的,而只有[1...k]的整体变动,然而这[1...k]的变动对[1...k]的转换次数并不会产生影响原创 2021-06-10 23:11:54 · 790 阅读 · 1 评论 -
使数组元素相等的减少操作次数
题目来源:https://leetcode-cn.com/problems/reduction-operations-to-make-the-array-elements-equal/解答:/** * @param {number[]} nums * @return {number} */function s(a,b){ return b - a;}var reductionOperations = function(nums) { let len = nums..原创 2021-06-10 01:00:59 · 167 阅读 · 0 评论 -
构成交替字符串需要的最小交换次数题解
一、题目描述给你一个二进制字符串 s ,现需要将其转化为一个 交替字符串 。请你计算并返回转化所需的 最小 字符交换次数,如果无法完成转化,返回 -1 。交替字符串 是指:相邻字符之间不存在相等情况的字符串。例如,字符串 "010" 和 "1010" 属于交替字符串,但 "0100" 不是。任意两个字符都可以进行交换,不必相邻 。示例 1:输入:s = "111000"输出:1解释:交换位置 1 和 4:"111000" -> "101010" ,字符串变为交替字符串。.原创 2021-05-19 21:39:14 · 805 阅读 · 0 评论 -
从 找出游戏的获胜者 中引发的思考
题目描述共有 n 名小伙伴一起做游戏。小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号。确切地说,从第 i 名小伙伴顺时针移动一位会到达第 (i+1) 名小伙伴的位置,其中 1 <= i < n ,从第 n 名小伙伴顺时针移动一位会回到第 1 名小伙伴的位置。游戏遵循如下规则: 从第 1 名小伙伴所在位置 开始 。 沿着顺时针方向数 k 名小伙伴,计数时需要 包含 起始时的那位小伙伴。逐个绕圈进行计数,一些小伙伴可能会被数过不止一次。 你数到的最后一名小伙...原创 2021-04-13 11:09:31 · 187 阅读 · 0 评论 -
最大和乘数
题目描述给定一个数组,求数组中区间内最小的数乘区间内数字和结果最大,比如数组[3,1,6,4,5,2]。区间6,4,5中,4×(6+4+5)=60,最大为60思路思路其实很简单以每个数为最小值,向四周扩散,由于最小得的性质,该操作不会产生重复的操作。但笔者一直在想其它的思路,如果你们有什么其它办法,欢迎在评论区评论,谢谢。function getR(arr){ //选每个数为最小值,向两边扩展 let result = 0; let firstP = 0;原创 2021-03-30 20:28:51 · 139 阅读 · 0 评论 -
替换字符串中的括号内容以及发现的一些js问题
题目描述给你一个字符串 s ,它包含一些括号对,每个括号中包含一个 非空 的键。 比方说,字符串 "(name)is(age)yearsold" 中,有 两个 括号对,分别包含键 "name" 和 "age" 。你知道许多键对应的值,这些关系由二维字符串数组 knowledge 表示,其中 knowledge[i] = [keyi, valuei] ,表示键 keyi 对应的值为 valuei 。你需要替换 所有 的括号对。当你替换一个括号对,且它包含的键为 keyi 时,你需要:...原创 2021-03-29 12:22:38 · 699 阅读 · 0 评论 -
1806. 还原排列的最少操作步数
题目描述还原排列的最少操作步数给你一个偶数 n ,已知存在一个长度为 n 的排列 perm ,其中 perm[i] == i(下标 从 0 开始 计数)。一步操作中,你将创建一个新数组 arr ,对于每个 i : 如果 i % 2 == 0 ,那么 arr[i] = perm[i / 2] 如果 i % 2 == 1 ,那么 arr[i] = perm[n / 2 + (i - 1) / 2]然后将 arr 赋值给 perm 。要想使 perm 回...原创 2021-03-29 11:17:41 · 313 阅读 · 0 评论 -
最长有效括号(hard)
题目描述给你一个只包含 '('和 ')'的字符串,找出最长有效(格式正确且连续)括号子串的长度。题目来源https://leetcode-cn.com/problems/longest-valid-parentheses/题目实例输入:s = "(()"输出:2解释:最长有效括号子串是 "()"输入:s = ")()())"输出:4解释:最长有效括号子串是 "()()"解题代码/** * @param {string} s * @return {numb..原创 2021-03-28 19:22:48 · 97 阅读 · 0 评论 -
红黑树代码实现
如有错误,还请各位大佬们指出来,谢谢。var Node = function(val,color){ this.val = val; this.color = color; this.original_color = color; this.left = null; this.right = null; this.parent = null;}var blackRedTree = function(Node=null){ this.root原创 2021-03-28 13:22:51 · 144 阅读 · 0 评论 -
如何遍历一次得到单链表倒数第n位值
采用两个指针,具体如下:function linkNode(val){ this.val = val; this.next = null;}function link(){ let head = new linkNode(-1); let len = 0; this.append = function(lNode){ let tmpNode = head; while(tmpNode.next !== null){ tmpNode = tmpN原创 2021-03-27 22:40:27 · 204 阅读 · 0 评论 -
在js中实现计数排序的一种方法
利用Object.keys()函数的性质实现快速计数排序,直接上代码:function countingSort(arr){ let tmp = []; let result = []; let len = arr.length; for(let i=0;i<len;i++){ if(!(tmp[arr[i]] > -1)){ tmp[arr[i]] = 1; }else{ tm原创 2021-03-25 02:00:15 · 225 阅读 · 0 评论 -
manacher算法的理解
manacher算法主要用线性时间复杂度求解给定字符串的最长回文,算法思路最先由一个名叫Glenn manacher的研究人员在1975年于A New Linear-Time ``On-Line'' Algorithm for Finding the Smallest Initial Palindrome of a String一文中提出,文献连接:https://dl.acm.org/doi/pdf/10.1145/321892.321896?download=true算法首先利用特殊字符将字符串填充原创 2021-03-23 14:26:46 · 122 阅读 · 0 评论 -
压缩算法
一、问题描述(题目来源与牛客网:https://www.nowcoder.com/test/question/c27561e5b7e0441493adb9a54071888d?pid=21283868&tid=42137527)小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为[m|S](m为一个整数且1<=m<=100),例如字符串ABCABCABC将会被压缩为[3原创 2021-03-16 17:43:47 · 163 阅读 · 0 评论 -
leetcode 周赛(hard),使所有区间的异或结果为零(js实现)
给你一个整数数组 nums 和一个整数 k 。区间 [left, right](left <= right)的 异或结果 是对下标位于 left 和 right(包括 left 和 right )之间所有元素进行 XOR 运算的结果:nums[left] XOR nums[left+1] XOR ... XOR nums[right] 。返回数组中 要更改的最小元素数 ,以使所有长度为 k 的区间异或结果等于零。来源:力扣(LeetCode)链接:https://leetco原创 2021-03-10 02:45:08 · 192 阅读 · 0 评论 -
(leetcode hard题)解答10.正则表达式匹配
一、题目描述给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。 '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/regular-expression-matching二、解答/** * @param {string} s * @param...原创 2021-03-04 00:12:01 · 221 阅读 · 1 评论 -
椭圆曲线数字签名算法(ECDSA)
算法步骤1.确定椭圆曲线具体包括确定模数P;系数a和b;生成器点A,构造素数阶循环群q.2.随机选取KPR值随机选取整数d,且有0<d<qKPR=d3.计算公钥B=dAKPB=(P,A,B,q,A,B)4.生成签名1.选择临时密钥Ke,其中0<Ke<q 确保Ke的随机性。2.R=Ke*A3.利用点R的x坐标初始化变量r,即r=xR4.签名f...原创 2020-02-09 18:19:06 · 948 阅读 · 0 评论 -
strassen算法
矩阵乘法基本算法伪代码var A,B //A、B表示为矩阵var C //存储结果矩阵var matrix_row=A.lengthvar matrix_col=B[0].lengthif(matrix_row != matrix_col){ return false}for(let i=0;i<matrix_row;i++){ for(let j=0;j<matr...原创 2020-02-08 18:06:29 · 390 阅读 · 0 评论 -
算法之渐近记号
算法之渐近记号θ记号O记号Ω记号符号的性质1)传递性2)自反性3)对称性4)转置对称性5)类比分析θ记号含义:θ(g(n))={f(n):存在正常量c1,c2和n0,使得对所有n>=n0,有0<=c1*g(n)<=f(n)<=c2*g(n)}若f(n)=θ(g(n)),则可称g(n)是f(n)的一个渐近紧确界(asymptotically tight bound)...原创 2020-02-06 16:21:32 · 578 阅读 · 0 评论