算法通关村专栏
文章平均质量分 65
此专栏分享本人从简单到困难一点一点学习算法,会有两个月左右的时间,20个关卡,每个关卡有三个等级,先就说这么多,开干
我爱学算法
学习和分享
展开
-
算法通关村 | 透彻理解动态规划
对于动态规划,我们自始至终,都要在大脑里装一个数组(可能是一维,也可能是二维),要看这个数组每个元素的含义是什么(也就是状态),要看每个数组是根据谁来算的(状态转移方程),然后就是从小到大挨着将数组填满(从小到大计算,实现记忆化搜索),最后看那个位置是我们想要的结果。原创 2023-09-15 21:37:00 · 423 阅读 · 0 评论 -
算法通关18关 | 回溯模板如何解决复原IP问题
LeetCode93 有效IP地址正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用','分割。18关的前几篇文章看过之后,对回溯的模板问题基本解题思路就知道了,就是固定的for循环问题,外层for循环控制横向,递归控制纵向,还要考虑撤销操作和元素是否能被重复利用问题,重复利用的情景较少,只用注意撤销就行。原创 2023-09-13 21:37:43 · 366 阅读 · 0 评论 -
算法通关18关 | 回溯模板如何解决排列和单词搜索问题
LeetCode46 给定一个没有重复数字的序列,返回其所有可能的全排列,LeetCode79 给定一个m x n 二维字符网格board和一个字符串单词。如果word存在在网格中,返回true,否则返回false。原创 2023-09-12 21:35:20 · 165 阅读 · 0 评论 -
算法通关村18关 | 回溯模板如何解决分割回文串问题
LeetCode131 分割回文串,给你一个字符串s,请你将s分割成一些字串,使每个字串都是回文串,返回s所有可能的分割方案。回文串是正着和反着读都是一样的字符串。原创 2023-09-11 21:33:50 · 642 阅读 · 0 评论 -
算法通关村18关 | 透析回溯的模板
回溯有清晰的解题模板,例如组合,分割、子集、排列、棋盘等,回溯和递归类似,不同的是撤销操作需要特别思考。原创 2023-09-10 19:59:54 · 410 阅读 · 0 评论 -
算法通关村17关 | 透析跳跃游戏
LeetCode55 给定一个非负整数数组,最初位于数组的第一个位置,数组中的每个元素代表你再该位置可以跳跃的最大长度,判断你是否能够达到最后一个位置。原创 2023-09-08 21:33:00 · 594 阅读 · 0 评论 -
算法通关村17关 | 盘点面试大热门之区间问题
LeetCode252 给定一个会议时间安排的数组intervals,每个会议时间都包括开始和结束时间,intervals[i] = [start, endi],请你判断一个人是否能参加这里面的全部会议。原创 2023-09-07 19:02:57 · 143 阅读 · 0 评论 -
算法通关村17关 | 贪心算法其实很简单
贪心算法是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法;贪心算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。《算法导论》给出了明确答案——贪心算法不能保证异地你个能得到最优解,但是相对很多问题确实可以得到最优解。内心:这跟没说不是一样?经典应用场景1. 排序问题:选择排序、拓扑排序2. 优先队列:堆排序3. 赫尔曼压缩编码。原创 2023-09-06 10:07:25 · 84 阅读 · 0 评论 -
算法通关村16关 | 堆与滑动窗口问题结合
LeetCode239 给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧,你可以看到在滑动窗口内的k个数字,滑动窗口每次只向右移动一位,返回滑动窗口中的最大值。原创 2023-09-05 08:16:29 · 220 阅读 · 0 评论 -
算法通关村16关 | 滑动窗口最长字串专题
滑动窗口最长字串专题,LeetCode3 给定一个字符串s,请你找出其中不含有重复字符的最长字串的长度。原创 2023-09-04 20:41:48 · 303 阅读 · 1 评论 -
算法通关村16关 | 滑动窗口如此简单
滑动窗口就是快慢指针问题,快指针走一步,慢指针走一步,维护窗口的大小。下图有大小为3的滑动窗口移动示例。原创 2023-09-03 11:17:33 · 397 阅读 · 1 评论 -
算法通关村15关 | 从10亿数字寻找最小的100万个数字
设计一个算法,给定一个10亿个数字,找出最小的100万个数字,假定计算机内存足以容纳全部10亿个数字。原创 2023-09-02 12:57:28 · 106 阅读 · 0 评论 -
算法通关村15关 | 从40亿中产生一个不存在的整数
给定一个输入文件,包含40亿个非负整数,请设计一个算法,产生一个不存在该文件中的整数,假设你有1GB的内存来完成这项任务。进阶:如果只有10MB的内存可用,该怎么办?原创 2023-09-02 11:33:45 · 83 阅读 · 1 评论 -
算法通关村15关 | 超大规模数据场景常见问题
创建一个长度为32000的数组,每个位置存储0或者1,因为要存的最大值可能是32000,所以我们可以要存多大的数,就在对应的位置0换成1即可,比如存1,数组第1位就是1,索引是0,其余位置是0。本身是一道海量数据问题的热身题,如果去掉“只有4KB”的要求,我们可以先创建一个大小为N的数组,然后将这些数据放进来,但是这里数组最大为32KB,而题目有4KB的内存限制,我们就必须先确定该如何存放这个数组。如果发现数组元素是v,那么就将位置为v的设置为1,碰到重复元素,就输出一下。原创 2023-09-02 10:59:42 · 399 阅读 · 0 评论 -
算法通关村14关 | 数据流中位数问题
中位数是有序列表中间的数,如果列表长度是偶数,中位数是中间两个数的平均值,例如:[2,3,4]的中位数是3,[2,3]中位数是(2+3)/ 2= 2.5设计一个数据结构:void addNum(int num) 从数据流中添加一个整数到数据结构中double findMedian()-返回目前所有元素的中位数。原创 2023-09-01 20:55:35 · 264 阅读 · 0 评论 -
算法通关村14关 | 堆在数组中找第k大的元素应用
给定整数数组nums和整数k,请返回数组中第k个最大的元素,原创 2023-09-01 20:14:14 · 246 阅读 · 0 评论 -
算法通关村14关 | 堆结构
堆是将一组数据按照完全二叉树的存储顺序,将数据存储在一维数组中的结构,对的结构有两种,一种称为大顶堆,一种称为小顶堆。也可称为大根堆,小根堆,或者最大堆,最小堆,假设一个节点的下标为i。有些地方叫做堆,有些地方叫做队列,两者到底是什么关系?优先队列:就是一种队列,它的工作是poll()/peek()出队列中最大、最小的那个元素,所以叫带有优先级的队列。能够实现优先功能的队列不一定只有堆,例如二项堆、平衡树、线段树、c++会用二进制分组的vector来实现一个优先队列。原创 2023-09-01 15:21:42 · 236 阅读 · 1 评论 -
算法通关村十三关 | 辗转相除法、素数和丑数
辗转相除法、素数、合数和丑数原创 2023-09-01 11:36:09 · 223 阅读 · 0 评论 -
算法通关村十三关 | 数组字符串加法专题
数组和字符串题目实现加法,较为简单,记住模板即可原创 2023-08-26 09:45:20 · 649 阅读 · 0 评论 -
算法通关村十三关 | 进制转换问题处理模板
给定一个十进制数M,以及需要转换的进制数N,将十进制数转化为N进制数,M是32位整,2原创 2023-08-25 13:07:15 · 193 阅读 · 0 评论 -
算法通关村十二关 | 字符串前缀问题
题目:LeetCode14,原创 2023-08-24 18:15:59 · 267 阅读 · 0 评论 -
算法通关村十二关 | 字符串经典题目
字符串问题,大家记得模板思路即可,一个类型的题目有很多种。原创 2023-08-23 20:36:11 · 248 阅读 · 0 评论 -
算法通关村十二关 | 字符串转换
LeetCode709:给你一个字符串s,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。每个字母都是有确定的ASCII的,可以根据码表操作子字符串,常见的ASCII范围是:将大写字母转换为小写字母,只需在原来的ASCII基础上加上32即可。原创 2023-08-22 09:44:13 · 323 阅读 · 0 评论 -
算法通过村十一关 | 如何实现压缩存储
创建一个长度为32000的数组,每个位置存储0或者1,因为要存的最大值可能是32000,所以我们可以要存多大的数,就在对应的位置0换成1即可,比如存1,数组第1位就是1,索引是0,其余位置是0。本身是一道海量数据问题的热身题,如果去掉“只有4KB”的要求,我们可以先创建一个大小为N的数组,然后将这些数据放进来,但是这里数组最大为32KB,而题目有4KB的内存限制,我们就必须先确定该如何存放这个数组。如果发现数组元素是v,那么就将位置为v的设置为1,碰到重复元素,就输出一下。暂时只知道思路,代码底层在研究。原创 2023-08-21 21:03:00 · 185 阅读 · 0 评论 -
算法通关村十一关 | 位运算实现加法和乘法
在计算机中,位运算的效率要比加减乘除的效率更高,因此在高性能软件中源码中大量使用,计算机里各种运算基本上都是位运算。原创 2023-08-20 11:55:12 · 326 阅读 · 0 评论 -
算法通关村十一关 | 位运算的规则
一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是自带符号的,在计算机用一个数的最高位存放符号,整数为0,负数为1。比如,十进制中的数+3,计算机字长8位,转换成二进制就是00000011.如果是-3.就是10000011。两者都是机器数。:因为机器数的第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数10000011,其实最高位1代表负,其真正数值是-3,而不是形式数值131(10000011转换成10进制等于131)。原创 2023-08-19 20:34:19 · 481 阅读 · 0 评论 -
算法通关村第十关 | 归并排序
分治法可以看作是"分而治之"的意思,也就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,从而使得原问题的解即子问题的解的合并。的思想实现的排序方法,该算法采用经典的分治策略(分就是将问题分成一些小的问题分别求解,而治则将分的阶段得到的各答案“合”在一起)。归并排序(MERARE-SORT)简单来说就是将大的序列先视为若干个比较小的数组,分成比较小的结构,然后是利用。归并排序算法就是应用归并思想的一个典型例子。都需要递归地解决子问题,并在最后合并子问题的解。原创 2023-08-18 07:33:45 · 260 阅读 · 0 评论 -
算法通关村第十关 | 数组中第k个最大元素
LeetCode:数组中的第k个最大元素,给定整数数组nums和整数k,请返回数组中第k个最大的元素,请注意,你需要找的是数组排序后第k个最大的元素,而不是第k个不同的元素。上面红框位置表示哨兵交换过后的位置,根据指针的移动情况,当指针停止的时候进行比较,大于哨兵,就去哨兵的左侧,而它空下来的位置就给哨兵,即红色圈出的位置。left: arr[left] < pivot时,不移动,arr[left] > pivot时,left++。运用快速排序的方法对数组进行排好序,然后选择第k个元素就是要求的结果,原创 2023-08-17 08:25:45 · 343 阅读 · 0 评论 -
算法通关村第十关 | 快速排序
如果我们每次选的pivot每次都正好在中间,效率时最高的,但是这是无法保证的,因此我们需要从最好、最坏和中间情况来分析。,将左右子序列运用同样的方法排序,知道最后剩余一个元素的时候结束,(其中的pivot这里用数组中间的元素)。最坏情况就是每次选择的恰好是left节点作为pivot,如果元素恰好都是逆序的,此时间复杂度为O(n^2)每次选择的都是中间结点,此时序列每次都是长度相等的列,此时的时间复杂度为O(nlogn)right: arr[right] > pivot时,不移动,否则,right--原创 2023-08-16 20:26:19 · 726 阅读 · 0 评论 -
算法通关村第九关 | 有序数组转搜索二叉树
题目:LeetCode108给你一个整数数组nums,其中元素已经按照升序排列,请你将其转换为一颗高度平衡的二叉搜索树。高度平衡二叉树是一颗满足每个结点的左右两个子树的高度差的绝对值不超过1的二叉树。它的左右子树也分别为二叉树。上的所有节点的值均小于它根节点的值;上所有节点的值均大于它的根节点的值;若它的左子树不为空,则。若它的右子树不为空,则。原创 2023-08-15 21:19:16 · 126 阅读 · 0 评论 -
算法通关村第九关 | 二叉树查找和搜索树原理
LeetCode852:题目核心意思是在数组中,从0到i是递增的,从i+1到数组最后是递减的,让你找到这个最高点。mid在上升阶段的时候,满足arr[mid] > arr[mid - 1] && arr[mid] < arr[mid + 1];mid在顶峰的时候,满足arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1];mid在下降阶段,满足arr[mid] < arr[mid - 1] && arr[mid] > arr[mid + 1];原创 2023-08-15 08:15:20 · 202 阅读 · 0 评论 -
算法通关村第九关 | 二分查找
基本查找也是顺序查找,我们看一下代码://顺序查找i++) {return i;return -1;原创 2023-08-13 11:44:11 · 90 阅读 · 0 评论 -
算法通关村第八关 | 寻找祖先问题
6的祖先结点有 3和5,7的是3,5,2,所以6和7的最近公共祖先是5。最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x,满足x是p、q的祖先,且x的深度尽可能大(一个节点也可以是它自己的祖先)。要想找到两个节点的最近公共祖先节点,我们可以从两个节点往上找,每个节点都往上走,一直走到根节点,我们在上面的树中查找6和7的公共祖先,遍历的逐步向下,假如某个时刻访问的结点为root,我们。LeetCode236,给定一个二叉树,找到该树中的两个指定结点的最近公共祖先,原创 2023-08-13 11:40:12 · 132 阅读 · 0 评论 -
算法通关村第八关 | 轻松搞定二叉树深度
子节点的判断逻辑和node(3)的判断逻辑是一样的,那么什么时候结束,也就是root == null返回0,至于入参,就是要处理的子树的根节点root,而返回值则是当前root所在子树的最大高度。说明:叶子结点是没有子结点的结点。很显然对于node(20),最大深度自然是左右子结点+1,左右子节点有的可能为空,只要有一个,树的最大高度就是1 + 1 = 2。对于node(3),最大深度是左右结点+1,左右子结点有的可能为空,只要有一个,树的最大深度就是1+1 = 2。下图给的例子最大深度为3。原创 2023-08-10 21:12:30 · 91 阅读 · 0 评论 -
算法通关村第八关 | 二叉树经典算法题
所谓的双指针就是定义了两个变量,在二叉树中有时候也需要定义两个变量解决问题,这两个变量可能针对一棵树,也可能针对两棵树,我们称之为双指针。双指针用在对称、反转和合并等类型相关。原创 2023-08-09 21:31:18 · 82 阅读 · 0 评论 -
算法通关村第七关 | 迭代遍历二叉树
迭代是过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。原创 2023-08-08 20:03:34 · 90 阅读 · 0 评论 -
算法通关存第七关 | 递归实现前中后序遍历
1.递归的四个步骤第一步:从小到大递推,第二步:分情况讨论,明确结束条件,第三步:组合出完整的方法,第四步:想法验证,则从小到大画图推演,原创 2023-08-07 20:49:32 · 70 阅读 · 0 评论 -
算法通关村第七关 | 理解递归
递归的过程一定是越来越简单的,不然越来越复杂,递归不会结束。原创 2023-08-07 18:55:52 · 40 阅读 · 0 评论 -
算法通关村第六关 | 二叉树层次遍历如此简单
先看基本最简单的情况,仅仅遍历并输出全部元素,基本遍历无需考虑返回每层的元素,只需先访问根节点,判断有无左右子节点,有则继续放入队列,然后继续出队,每次只会出来一个元素,知道队列为空的时候退出就行。原创 2023-08-06 21:16:30 · 64 阅读 · 0 评论 -
算法通关村第六关 | 如何使用中序和后序来恢复一颗二叉树
前中后序遍历,其中“前、中、后”是代表根节点的位置。前序则根节点在前。前序遍历:中左右中序遍历:左中右后序遍历:左右中 因为中序:左中右,后序:左右中根据遍历顺序可以知道根节点是 1,左边节点:3 4 8 6 7 5 2 右边节点:10 9 11 15 13 14 12我们推理左边节点,结合后序节点,2最后出现所以2为1的左结点然后一步步推理:如果出现中序第一个节点是后序最后一个节点,那么这个节点没有左子节点中序最后一个也是后序最后一个,那么前面节点属于右子树。原创 2023-08-06 15:28:14 · 117 阅读 · 0 评论