LeetCode刷题笔记
文章平均质量分 91
yumuing blog
学习中
展开
-
回溯算法:排列与组合详解
回溯算法,本质上是一种穷举算法,属于暴力搜索算法的一种。它虽然可以使用剪枝进行优化,仍不高效,但却实用。它往往能够解决可以抽象成树形结构的问题,亦可以认为是使用 K 层 for循环实现搜索的问题:组合问题:按一定规则在 N 个数中找出 K 个数的集合切割问题:一个字符串按一定规则切割成子串,求子串个数或符合条件的子集子集问题:在N 个数的集合中,存在按一定规则分割出的符合某些条件的子集排列问题:N 个数按一定规则全排列,求其排列结果棋盘问题:N 皇后问题、数独问题、迷宫问题等等注:组合与全排原创 2022-04-02 17:00:35 · 1783 阅读 · 0 评论 -
Manachar算法(马拉车算法):快速求取最长回文子串
当我们求取最长回文子串时,常见的方法就是中心扩散法,即从字符中心出发,向两边对比,检查是否相等,若等于,则继续检查,并使当前字符中心对应的最长回文子串长度加一,否则,结束该字符中心的回文检查,比较与当前整个字符串的最长回文子串,考虑是否更新整个字符串的最长回文子串长度,继续进行下一个字符的判断。这种方法的时间复杂度仍为 O(n2)O(n^2)O(n2) ,较普通的暴力破解的方法有着不错的优化,但也不是最佳的思路,相关的代码如下:public class Solution { private in原创 2022-03-13 18:04:39 · 2023 阅读 · 0 评论 -
逆波兰表达式:计算包含括号的四则运算表达式
平时我们进行数学计算使用的常见书写方式就是中缀表达式,即每一个运算符号都位于计算数的中间,如下:(1+2)÷3(1+2)\div3(1+2)÷3而这对于计算机进行求取结果来说,并不是一个最优的方案,毕竟每次读取到一个运算符,都得判断一次优先级,并且需要确定两个计算数的目标位置。在四则运算的基础之上,还在添加一个括号的使用,这将更为复杂,中缀表达式将更加对计算机不友好。那什么样的表达式结构会是计算机较为优化的呢?答案就是逆波兰表达式,也叫做后缀表达式,它最大的好处就是无需再考虑运算符的优先级,也无需原创 2022-03-06 22:01:50 · 1711 阅读 · 0 评论 -
拓扑排序:求取拓扑序列
拓扑排序简单讲就是在可求拓扑序列的有向无回路图(有向无环图)中求取拓扑序列的排序算法。相关概念拓扑序列通俗讲就是按活动的先后次序进行排序的序列,并且每一个顶点只出现一次,它可以表述出完成某一项活动所需要的前置活动都有哪一些!当然,一个图的拓扑排序不唯一。例子:修学课程都有其先修课程,利用拓扑序列就能快速的获得所有的先修课程游戏任务都有前置任务,利用拓扑序列,就能清楚所有的任务链条依赖包的加载顺序也是利用拓扑序列来处理的求取拓扑序列的图:有向无环图有向:对于一个顶点到另一个原创 2022-02-24 20:29:04 · 11838 阅读 · 3 评论 -
排序算法的简单认识
在进行很多便捷算法之前总是要实现对象的有序化,而这就将使用到排序相关的算法,即使目前诸多高级语言已然完成对于排序算法的封装,用户只需导入对应库文件即可调用排序算法完成排序,无需手写排序算法,但具体的排序算法的选择就必须对于排序算法有所认识。本文就将介绍两个简单的排序算法:选择排序与冒泡排序。选择排序为什么称为选择排序?该算法每次都是对于未排序的关键字进行比较,选择出最小或最大的关键字,再对其交换位置,实现一次排序,需进行多次比较。选择排序法是一种不稳定的排序算法。它的工作原理是每一次从待排序的数据元原创 2022-02-21 21:20:56 · 327 阅读 · 0 评论 -
KMP 算法:快速匹配字符字串
KMP 算法主要是在一定长度的字符串中快速匹配出所需的目标字符串,也称模式字串,最大特点就是讲究一个快字。一般是适用于字符串进行比对或者匹配的场景之下,基本概括为在字符串不匹配,需进行下一次匹配时,利用已知的已匹配的字符串(文本内容)避免从头开始匹配带来的浪费。如果是暴力解决的话,步骤如下:定义头指针以及字符指针,分别指向定长字符串最左端、模式字符串最左端依次对字符进行比较,发现不匹配字符,回溯指针到指针开始匹配的下一位重复第二步,直至找到对应字符串,即模式字符串使用暴力解法,效率低下的原创 2022-02-21 20:44:11 · 1621 阅读 · 0 评论 -
刷题算法:快慢指针法
快慢指针法指的就是操作数组、链表及字符串等使用两个起点相同但前进步数不同的指针。相对于利用多次循环解决问题,快慢指针法的时间复杂度较低,执行效率高。对于快慢指针法根据题目可供调整的无非就为两点:起点前进步数快慢指针法起点位置的选择通常是采取一个 if else 语句进行判断,而在未达到正确起点位置时,两个指针的前进步数将保持一致。而实现快慢指针前进步数不一致移动的方法通常是采取一个 for 循环进行移动指针,注意越界问题。此处 for 循环迭代有两种方案:既可以设置快慢指针的步数一致,再在 i原创 2022-02-15 23:36:39 · 378 阅读 · 0 评论 -
刷题算法:滑动窗口法
滑动窗口法就是在不断地调整子序列地起始位置与终止位置,从而得出我们想要的结果。滑动窗口法的起始与终止节点的移动的目的即为求解子序列的最优化处理,其基本的思路如下:定义双指针,初始值一致,双指针之间的内容为所谓的窗口,包括双指针所指的元素。确定指针之间的最佳窗口内容的判断条件,即窗口内容扩大、缩小的条件。优先移动终止节点,扩大窗口直至恰好满足判断条件,再移动起始节点一次缩小窗口再次判断是否符合条件,符合,此时为一次所求解的子序列,记录所需参数,继续移动起始节点,不符合,起始节点不动,移动终止节点至恰原创 2022-02-15 23:35:44 · 378 阅读 · 0 评论 -
欧拉函数:求小于等于n且与n互质的数的个数
求小于等于n且与n互质的数的个数互质穷举法互质:两个数互质代表两者最大公约数为1最大公约数求法:辗转相除法,最小公倍数:较大值除以最大公约数乘以较小值辗转相除法:较大的数a取模较小的数b,得取模值c若取模值等于0 则最大公约数为取模值,否则继续下一步a与c再次取模,回到第二步//求最大公约数gcd以及最大公倍数lcm // 36 24 36/24 // 24 12 24/12 // 0 结束最大公约数为12 // 求最小公倍数 // lcm(a, b) = (a * b)/g原创 2022-02-15 23:34:24 · 3187 阅读 · 0 评论 -
LeetCode刷题:数组快慢指针法
快慢指针法指的就是操作数组、链表及字符串等使用两个起点相同但前进步数不同的指针。相对于利用多次循环解决问题,快慢指针法的时间复杂度较低,执行效率高。对于快慢指针法根据题目可供调整的无非就为两点:起点前进步数快慢指针法起点位置的选择通常是采取一个 if else 语句进行判断,而在未达到正确起点位置时,两个指针的前进步数将保持一致。而实现快慢指针前进步数不一致移动的方法通常是采取一个 for 循环进行移动指针,注意越界问题。此处 for 循环迭代有两种方案:既可以设置快慢指针的步数一致,再在 i原创 2022-01-09 14:48:16 · 200 阅读 · 0 评论 -
LeetCode的使用方法
LeetCode 是一个上提供一系列的算法题,并且具备多种编程语言优秀在线编辑体验。在这样的基础之上,LeetCode 对于各类题目的描述简洁易懂,题库更新极快,最重要的是它的含金量受到大众的认可,拥有庞大的用户群体,对于每一道算法题基本能够寻找到较好的解题思路。特别说明的是,该平台更为着重对于算法思路的训练,采取的并非 ACM 模式的全包全揽,而是提供一个需要实现的函数,测试用例的定义和主方法的调用等等将由系统提供。 需要训练 ACM 模式的,可以尝试牛客网的刷题模式。LeeCode 刷题思路作为一个原创 2022-01-09 08:31:38 · 9875 阅读 · 1 评论 -
LeetCode刷题笔记:二分查找简单进阶
对于二分算法的简单进阶认识,利用两道LeetCode题型巩固认识!原创 2022-01-09 02:04:58 · 744 阅读 · 0 评论 -
Leetcode刷题笔记:二分查找算法
LeetCode 对于数组查询算法之一的二分查找算法的简单认识。原创 2022-01-09 01:59:34 · 1148 阅读 · 0 评论