![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 58
四面八方来
keep learning
展开
-
KMP入门与算法题实践
下面是两个b站上个人借鉴学习的视频第一个视频用来快速理解KMP:第二、三个视频用来理解流程和写代码:KMP(Knuth-Morris-Pratt)算法是一种用于字符串匹配的高效算法。它利用之前部分匹配的结果来避免重复的匹配操作,从而提高匹配效率。KMP算法主要包括两个部分:算法题P3375 模板 KMP洛谷P3375模板代码如下:P4391无线传输思路:答案是 n - next[n-1]一个字符串的公共前后缀长度范围为 0-n-1,也就是没有相同的和都是同一个字符重复循环的字符串,原创 2024-08-01 12:22:33 · 404 阅读 · 0 评论 -
【STL】C++之哈希表unordered_map和unordered_set
哈希map常用方法删除元素:可以使用 方法按键删除元素,也可以使用 方法删除所有元素。查找元素:可以使用 方法查找指定键的元素,返回迭代器指向该元素,如果未找到则返回尾后迭代器。大小和容量:可以使用 方法获取哈希表中键值对的数量,使用 方法检查哈希表是否为空。迭代器:可以使用迭代器遍历哈希表中的键值对。桶相关方法:哈希表内部使用桶来存储元素,可以使用 方法获取桶的数量,使用 方法获取指定桶中元素的数量原创 2024-03-12 10:47:55 · 920 阅读 · 0 评论 -
【STL】C++之vector的常用方法
代码模拟:原创 2024-03-09 10:33:09 · 301 阅读 · 0 评论 -
【STL】C++之优先队列priority_queue的常用方法
priority_queue的基本用法和算法题二维数组的运用示例。算法题思路:这里创建一个优先队列保存奶酪差值:第一只老鼠得分-第二只老鼠得分 ,采用贪心思想选取最高的前k个值。头文件:#include原创 2024-03-05 13:35:00 · 323 阅读 · 0 评论 -
Leetcode48旋转图像
矩阵性质,可以发现对角线翻转之后就是逆时针转了九十度,左右再翻转就是顺时针转了九十度。行列转换,第一行变到第三列,第二行变到第二列,第三行变到第一列。方法二、对角线翻转+左右翻转。方法一、一般辅助数组解法。原创 2023-11-06 12:09:23 · 275 阅读 · 0 评论 -
Leetcode41缺失的第一个正数
此时会思考能不能用一个哈希表来保存出现过的1~N+1的数,然后从 1 开始依次枚举正整数,并判断其是否在哈希表中。这里将原数组当做哈希表,使用标记的办法来标记出现过的正整数,最后遍历数组,第一个没出现的下标+1就是答案。长度为N的数组,没有出现过的正整数一定是1~N+1中的一个。但是题目要求常数级别的空间,就不能使用N的哈希表了。原创 2023-11-05 11:33:33 · 179 阅读 · 0 评论 -
Leetcode76最小覆盖子串
3. 怎么判断是否覆盖:这里使用两个哈希表,一个保存目标子串字符数,一个保存窗口内的字符数,注意是窗口内的,因为需要用窗口的和目标子串进行比较来控制移动。4. 怎么控制循环:外层循环while(right原创 2023-11-03 23:16:25 · 131 阅读 · 0 评论 -
算法通关村第19关【黄金】| 继续盘点高频动态规划dp问题
思路:确定dp:dp[i][j]子串是否是回文串确定递推公式:例如:aa|cbc|aa dp[2][4] = dp[3][3] true确定初始化:dp[i][i] = true,一个字母都是回文确定遍历顺序:子串从长度2开始一直到len长度,从小到大。i从小到大,不可以更换顺序两个一组从头遍历到尾,三个一组从头遍历到尾,456....len个一组遍历到尾。原创 2023-10-26 14:36:02 · 79 阅读 · 0 评论 -
算法通关村第19关【白银】| 动态规划高频问题
思路:确定dp:这里是最少硬币的个数,不是种类确定递推公式:dp[j] = Math.min(dp[j],dp[j-coins[i]]+1),不要当前硬币dp[j]还是保持以前的组合方法,要当前硬币dp[j-coins[i]]+1确定初始化:dp[0]=0,其他的都得初始化最大值确定遍历顺序:组合排列都无所谓,保证完全背包从前往后即可。原创 2023-10-20 17:56:46 · 956 阅读 · 0 评论 -
算法通关村第19关【青铜】| 动态规划
动态规划(Dynamic Programming,简称DP)是一种解决多阶段决策过程最优化问题的数学方法。它通常用于解决那些具有重叠子问题和最优子结构性质的问题,这些问题可以分解为多个相互关联的子问题。动态规划的核心思想是将原问题分解为较小的子问题,然后解决这些子问题,最后合并它们的解以获得原问题的最优解。这个方法通常涉及到创建一个表格或数组来存储子问题的解,以,从而提高算法效率。关键特征和步骤:重叠子问题:原问题可以分解为多个相似或相同的子问题,这些子问题可能需要多次解决。原创 2023-10-17 14:20:03 · 181 阅读 · 0 评论 -
算法通关村第18关【黄金】| 继续回溯
思路:单层for循环start控制开始位置,逐个遍历情况取,附带剪枝,递归返回后进行point回溯深度递归pointNum三层,确定终止条件。原创 2023-10-17 11:07:24 · 558 阅读 · 0 评论 -
算法通关村第18关【白银】| 回溯热门问题
思路:回溯模板(1)确定方法返回值和参数分析可知遍历数组然后求和值,不需要返回什么值参数也就是candidates,list,path,target,start(2)确定回溯终止条件当满足求和的时候终结(3)确定单层逻辑判断当前是否满足条件是就添加进条件,然后返回不是就继续向下递归,这里需要注意从i开始,也就是可以取自己当递归返回的时候需要进行回溯,也就是弹出上一个已经使用过的值。原创 2023-10-16 20:21:52 · 344 阅读 · 1 评论 -
算法通关村第18关【青铜】| 回溯
回溯算法是一种解决组合优化问题和搜索问题的算法。它通过尝试各种可能的选择来找到问题的解决方案。回溯算法通常用于问题的解空间非常大,而传统的穷举法会导致计算时间爆炸的情况。回溯算法可以帮助限制搜索空间,以提高效率。回溯算法的核心思想是在搜索问题的解空间时,逐步地构建解决方案,并在发现当前解决方案无法达到最终目标时,返回上一步(回溯),并尝试另一个选择,一直重复这个过程,直到找到问题的解或确定无解。:从问题的解空间中选择一个候选解,通常是从多个选择中的一个。原创 2023-10-13 00:08:01 · 254 阅读 · 0 评论 -
算法通关村第17关【黄金】| 跳跃游戏问题
思路:每个nums[i]+i代表当前最后覆盖范围,这里和字符串分割那道题一样求覆盖区间,取cur的最大值。原创 2023-10-11 14:18:53 · 322 阅读 · 0 评论 -
算法通关村第17关【白银】| 贪心高频问题
思路:很容易理解一个人不可能同时出席两场会议,也就是会议时间不能重叠。先按照开始时间排序,逐个比较下一个会议开始时间是否大于前一个会议的结束时间。原创 2023-10-10 15:26:14 · 194 阅读 · 0 评论 -
算法通关村第17关【青铜】| 贪心
贪心算法(Greedy Algorithm)是一种常见的算法设计策略,通常用于解决一类优化问题。其核心思想是:在每一步选择中都采取当前状态下的最优决策,从而希望最终能够达到全局最优解。贪心算法不像动态规划算法需要考虑各种子问题的组合,它仅关注每一步的最优选择,因此通常更加高效。原创 2023-10-08 00:25:30 · 331 阅读 · 0 评论 -
算法通关村第16关【黄金】| 滑动窗口与堆结合
一般想法是堆的根结点保存当前窗口最大值,循环加入元素,怎么判断根结点是不是在窗口内呢。那就是还需要保存元素对应的下标,当根结点的下标在窗口外(一定会在最左侧)就剔除。思路:求最大值和前k个最大值通常就要考虑使用堆。原创 2023-10-07 11:00:48 · 221 阅读 · 0 评论 -
算法通关村第16关【白银】| 滑动窗口经典问题
思路:窗口内为无重复字符子串,使用哈希表来保存最新碰到的字符下标,只要出现重复就缩小left指针,缩小到无重复字符也就是map.get(c)+1。原创 2023-09-25 15:17:48 · 179 阅读 · 0 评论 -
算法通关村第16关【青铜】| 滑动窗口思想
一句话概括就是两个快慢指针维护的一个会移动的区间固定大小窗口:求哪个窗口元素最大、最小、平均值、和最大、和最小可变大小窗口:求一个序列里最大、最小窗口是什么。原创 2023-09-24 11:34:12 · 473 阅读 · 0 评论 -
算法通关村第15关【黄金】| 海量数据场景下热门问题
题目要求: 假设你有一个20GB的文件,每行一个字符串,请说明如何对这个文件进行排序?先将20GB的文件分块,如果我们只有10GB的内存空间,可以分成20块,然后单独对分块进行排序将分块两两归并,也可以使用堆排序合并为一个。原创 2023-09-23 10:49:28 · 127 阅读 · 0 评论 -
算法通关村第15关【白银】| 海量数据场景下的热门算法题
题目要求: 给定一个输入文件,包含40亿个非负整数,请设计一个算法,产生一个不存在该文件中的整数,假设你有1GB的内存来完成这项任务进阶: 如果只有10MB的内存可用,该怎么办?原创 2023-09-23 09:48:27 · 160 阅读 · 0 评论 -
算法通关村第14关【黄金】| 数据流的中位数
添加数字 3.5: queMin: [3, 4, 5] queMax: [3.5, 1, 2] 中位数 3.25。添加数字 4: queMin: [3, 4] queMax: [2, 1] 中位数 2.5。添加数字 5: queMin: [3, 4, 5] queMax: [2, 1] 中位数3。添加数字 3: queMin: [2, 3] queMax: [1] 中位数2。添加数字 1: queMin: [1] queMax: [] 中位数1。初始状态: queMin: [] queMax: []原创 2023-09-21 12:14:18 · 170 阅读 · 0 评论 -
算法通关村第14关【白银】| 堆的经典问题
例如找第k大的数,新建一个空间为k的最小优先队列,只要比当前优先队列最小值大就替换进去,这样全部的数遍历一遍,里面留下的就是前k大的数了,其他的全被替换出去了,并且队头是第k最大的。原创 2023-09-20 10:42:46 · 207 阅读 · 0 评论 -
算法通关村第14关【青铜】| 什么是堆
堆构造原创 2023-09-18 14:42:22 · 165 阅读 · 0 评论 -
算法通关村第13关【黄金】| 数论问题
思路:欧几里得算法【欧几里得演算法(辗转相除法)】 https://www.bilibili.com/video/BV19r4y127fu/?原创 2023-09-18 13:42:23 · 226 阅读 · 1 评论 -
算法通关村第13关【白银】| 数字与数学高频问题
数字高频问题原创 2023-09-14 16:44:04 · 184 阅读 · 0 评论 -
算法通关村第13关【青铜】| 数字与数学基础问题
数字统计、溢出、进制转换原创 2023-09-12 12:55:31 · 192 阅读 · 0 评论 -
算法通关村第12关【黄金】| 字符串冲刺题
思路:纵向比较,每个字符串从头挨个比较。原创 2023-09-07 14:42:48 · 508 阅读 · 0 评论 -
算法通关村第12关【白银】| 字符串经典问题
反转字符串、k个一组反转、仅仅反转字母、验证回文串、字符串中的第一个唯一字符、有效的字母异位词原创 2023-09-06 16:52:44 · 243 阅读 · 0 评论 -
算法通关村第12关【青铜】| 字符串转换问题
思路:ASCll码中,a-z:97-122 A-Z:65-90小写转大写-32,大写转小写+32。原创 2023-09-05 20:50:31 · 292 阅读 · 0 评论 -
算法通关村第11关【黄金】| 用4KB内存寻找重复元素
这里采用一种压缩空间的方式——位图,每一位表示对应的一个整数,用32000位就能代表32000个整数,直接每个元素节省了一个int大小也就是4B的空间。,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB的内存可用,该如何打印数组中所有重复元素。初始化数组时:this.bitset = new int[size >> 5] => 每32缩小一个int大小。例如34,先34>>5等于1,再34&(11111)等于2(00010),对应bitset[1]中的第2位。原创 2023-09-05 10:17:19 · 275 阅读 · 0 评论 -
算法通关村第11关【白银】| 位运算高频算法题
思路:利用一个数和1与操作,结果就是最低位的特点,每次右移都能知道一位是不是1将最低位的 '1' 变为 '0',并将低位的 '0' 变为 '1',然后与n进行按位与运算,即可将最低位的 '1' 置为 '0'。这个算法的精妙之处在于,它不需要遍历所有的位,而是通过不断地将最低位的 '1' 置为0来计算 '1' 的个数,从而实现了高效的计算。这对于处理大量二进制数据的情况非常有用。原创 2023-09-04 22:53:11 · 283 阅读 · 0 评论 -
算法通关村第11关【青铜】| 位运算基础
原码、反码和补码都是计算机中用于表示有符号整数的方式。它们的使用旨在解决计算机硬件中的溢出和算术运算问题。原码最简单,它的表示方式是用最高位表示符号位,0表示正数,1表示负数,其余位表示数值的绝对值。例如,+5 的原码是 00000101,-5 的原码是 10000101。反码表示方式在原码的基础上,负数的表示方式稍作修改。对于正数,反码与原码相同。对于负数,反码是将原码中的1变成0,0变成1。例如,+5 的反码仍然是 00000101,-5 的反码是 11111010。补码是计算机中最常用的表示方式。原创 2023-09-04 11:33:11 · 420 阅读 · 0 评论 -
算法通关村第10关【黄金】| 归并排序
归并排序(Merge Sort)是一种常见的基于比较的排序算法,它的主要思想是分而治之(Divide and Conquer)。它的核心思想是将一个大的问题分解为小的子问题,解决子问题,然后将它们合并(merge)以获得最终的解决方案。:将两个有序的子数组合并成一个有序的大数组。在合并过程中,我们逐个比较两个子数组中的元素,将较小的元素放入新的数组,重复这个过程,直到将两个子数组全部合并为一个有序数组。归并排序的时间复杂度是稳定的,它保证在最坏、平均和最好的情况下都是O(n log n)。原创 2023-09-02 15:19:10 · 264 阅读 · 0 评论 -
算法通关村第10关【白银】| 数组中第k大的数
思路:快速排序,每次都定位一个元素,找指定位置的元素还得有序,很容易就想到快排思想。小优化之处就是当前归位元素比目标元素小就继续往右,比目标元素大就往左,相等就返回。原创 2023-09-02 13:04:10 · 352 阅读 · 0 评论 -
算法通关村第10关【青铜】| 快速排序各种写法
最好的情况每次指定的都是中间位置的数字,划分完后两边长度相等,2T(n/2) + O(n),复杂度O(nlog(n))最坏的情况,每次指定的都是最小的数字,n的复杂度归位,一共n次,T(n-1) + O(n),复杂度O(n^2)指定一个数字,将数组比他小的放到左边,比他大的放到右边,实现归位。可以证明,平均情况下的时间复杂度也是O(nlog(n))然后再指定一个数字递归,一直遍历完数组。原创 2023-09-02 01:46:26 · 315 阅读 · 0 评论 -
算法通关村第9关【黄金】| 两道有挑战的问题
思路:二分法,这个算法保证了每次选择的中间元素都能保持左右子树的高度差不超过 1,从而构建一个高度平衡的二叉搜索树。这个过程类似于分治法,通过递归不断将大问题分解成小问题并解决。原创 2023-08-31 17:01:20 · 268 阅读 · 0 评论 -
算法通关村第9关【白银】| 二分查找与搜索树高频问题
二分查找拓展问题,中序和搜索树问题原创 2023-08-30 21:22:07 · 299 阅读 · 0 评论 -
算法通关村第9关【青铜】| 二分查找
递增数组,从头往尾查找,O(n)的时间即可找到。二分与分治,循环与递归原创 2023-08-29 13:11:02 · 214 阅读 · 0 评论 -
算法通关村第8关【黄金】| 寻找祖先问题
其他所有的结点都是null即不是目标结点,直接将搜索到的第一个p/q(不是null的结点)一路返回。这种情况遍历到的第一个目标p/q就是题目所要的最近公共祖先返回即可。二种情况就是p,q本身就是最近公共祖先,p/q在左右子树上。题目又涉及到p,q就需要传入p,q,需要遍历传入root。首先要找到最近公共结点和p,q有什么特别关系。题目要求找到指定的结点,就需要返回结点。或者遍历到p,q目标结点返回目标结点。第一步:确定参数和返回值。第二步:确定终止条件。第三步:确定单层逻辑。原创 2023-08-28 11:37:57 · 659 阅读 · 0 评论