自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 windows平台虚拟机安装

官网。

2024-03-30 13:19:34 752

原创 算法通关村第十九关:白银挑战-动态规划高频问题

综上,f[i] = f[i-1](条件:a[i]可以对应一个字母) + f[i-2](条件:a[i-1]a[i]可以对应一个字母)f[i] = f[i-1](条件:a[i]可以对应一个字母) + f[i-2](条件:a[i-1]a[i]可以对应一个字母)子问题:参考硬币的问题,f[i] = min(f[i-j*j]+1, f[i]) 1<=j<i^0.5。情况2:2个数字解码 a[i-1]a[i]对应一个字母,f[i] = f[i-2]f[0]=0,其他如果不能拼出来标记为 f(x)=正无穷。

2023-09-13 15:05:09 1487 1

原创 算法通关村第十九关:青铜-动态规划是怎么回事

本题涵盖了DP里的多个方面,比如重复子问题、记忆化搜索、滚动数组等等这就是最简单的动态规划了,只不过我们这里的规划是 dp[j] = dp[j] + dp[j-1],不用进行复杂的比较和计算这个题目非常重要,对后面理解递归、动态规划等算法有非常大的作用。

2023-09-12 15:23:33 243

原创 算法通关村第十八关:白银挑战-回溯热门问题

这个问题与前面组合等问题的一个区别是使用过的后面还要在用,如[1,2]和[2,1],从集合的角度看是一个,从排列的角度看是两个。回退只选1个2时,target=7-2=5,这时候不能选择2,从序列{3,6,7}中选择,没有符号要求的。回退只选2个2时,target=7-2-2=3,序列{2,3,6,7}中有3,满足要求,{2,2,3}这里的数字是干扰项,我们需要做的是过滤掉数字,只处理字母。再选择1个2,剩下target=7-2-2-2=1,小于列表中最小的数2,不满足要求了。子集就是要遍历整棵树。

2023-09-09 17:43:02 274

原创 算法通关村第十八关:青铜挑战-回溯是怎么回事

深度优先搜索就是从根节点开始一直找到叶子结点,这里可以先判断当前节点是不是叶子结点,再决定是不是向下走,如果是叶子结点,我们就增加一条路径。从回溯的角度分析,得到第一条路径ABD之后怎么找到第二条路径ABE,这里就是先将D撤销,然后再继续递归就可以了。这就是组合类型问题,除此之外,子集、排列、切割、棋盘等方面都有类似的问题,我们需要找到更好的方式。回溯不是万能的,解决的问题也是非常明确的,例如组合、分割、子集、排列、棋盘等。所有的回溯都是一个大框架,因此透彻理解回溯的框架是解决一切回溯问题的基础。

2023-09-08 17:12:06 473

原创 算法通关村第十七关:黄金挑战-跳跃游戏问题

关键是判断能否到达终点,不用管每一步跳跃到哪里,而是尽可能的跳跃到最远的位置。看最多能覆盖到哪里,只要不断更新能覆盖的距离,最后能覆盖到末尾就行了。

2023-09-08 11:24:47 345

原创 算法通关村第十七关:白银挑战-贪心高频问题

该遍历过程相当于要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。总油量 - 总消耗 ≥ 0,可以跑完一圈,具体到每一段就是各个加油站的剩油量 rest[i] 相加一定是大于等于0的。区间已经按照起始端点升序排序,我们直接遍历区间列表,寻找新区间的插入位置即可。因为一个人在同一时刻只能参加一个会议,因此题目的本质是判断是否存在重叠区间。[ 区间1起始时间,max(区间1结束时间,区间2结束时间) ]复杂度降低:从O(n^2)降低到O(n)区间1,区间2 合并。

2023-09-07 17:33:39 504

原创 算法通关村第十七关:青铜挑战-贪心其实很简单

是指在问题尽心求解时,在每一步选择中都采取最好或者最优(最有利)的选择,从而希望能够导致结果最好或者最优的算法。大饼干既可以满足胃口大的孩子,也可以满足胃口小的孩子,就应该优先满足胃口大的;贪心算法所得到的结果不一定是最优的结果,但是都是相对近似最优解的结果。贪心策略:考虑胃口,大饼干先喂饱大胃口,最后看能满足几个孩子的需要。将常见的贪心题都找出来看看大致是什么样子的,学一学就行了。局部最优:大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个。既要满足小孩的胃口,也不要造成饼干的浪费;分析下主要有三种情况。

2023-09-07 15:07:55 354 1

原创 算法通关村第十六关:黄金挑战:滑动窗口与堆结合

对于最大值,K个最大这种场景,优先队列(堆)是首先该考虑的思路。堆的大小一般是有限的,能直接返回当前位置下的最大值或者最小值。该特征与滑动窗口结合,可以解决一些特定场景的问题。大根堆可以帮我们实时维护一系列元素的最大值。

2023-09-07 10:55:43 291

原创 算法通关村第十六关:白银挑战-滑动窗口经典问题

要找最长子串,需要直到无重复字符串的首和尾,然后再确定最长的那个,需要两个指针,可利用滑动窗口思想。设计一下hashmap的key-value的含义,key:字符,value:窗口中最右边的字符位置。给你一个字符串 s ,请你找出 至多 包含 两个不同字符 的最长子串,并返回该子串的长度。长短板分列最左边和最右边,宽度最大,此时长板或短板向中间收窄,宽度会变小,此时板的高度。增加了一个列表,记录出现异位词的位置,如果出现了,将其加到列表中。盛水的体积的计算:短板的高度*长短板之间的宽度。

2023-09-07 09:18:52 378

原创 算法通关村第十六关:青铜挑战-滑动窗口其实很简单

所谓窗口,就是建立两个索引left和right,保持 {left,right} 之间一共有3个元素,然后一边遍历序列,一边寻找,每改变一下就标记一下当前区间的最大和。如下图所示,假设窗口是3,当不断有新数据来时,维护一个大小为3的一个区间,超过3就将新的放入,老的移走。如图所示,实例序列 1,3,5,4,7,8,9,2 最长递增子序列 4,7,8,9 结果应返回4。一边遍历,一边统计每个递增区间的长度,如果长度超过之前左右区间的长度,将其保留。典型的滑动窗口,窗口大小固定了,就是K。掌握窗口和滑动的概念。

2023-09-06 14:13:05 259

原创 算法通关村第十五关:白银挑战-海量数据场景下的热门算法题

把一个大的集合通过哈希函数分配到多台机器中,或者分配到多个文件里,这种技巧是处理大数据面试时最常用的技巧之一。但是具体分配多少台机器,分配到多少个文件,在解题时一定要确定下来,面试官指定或者具体的限制本题中确定分成16个文件,就是根据内存限制 2GB 的条件来确定的。

2023-09-06 09:43:57 382

原创 算法通关村第十五关:青铜-用4KB内存寻找重复元素

给定一个数组,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB的内存可用,该如何打印数组中所有重复元素。如果发现数组元素是v,那么就将位置为v的位设置为1,碰到重复元素,就输出一下。如果没有内存要求,创建一个大小为N的数组,然后将这些整数(32位)放进来,N最大为32000,则需要 32000。因此我们可以创建32000比特的位向量(比特数组),其中一个比特位置就代表一个整数,类似索引。1字节 = 1byte(拜特) = 1B = 8bit(比特,位)

2023-09-05 14:48:12 494

原创 算法通关村第十四关:黄金挑战-数据流的中位数

加4 小顶堆[3,4] 大顶堆[2,1] 中位数 (3+2)/2。加2 小顶堆[2] 大顶堆[1] 中位数 (2+1)/2。加5 小顶堆[3,4,5] 大顶堆[2,1] 中位数 3。如[1,2,3,4,5],分成小顶堆[3,4,5],大顶堆[2,1],中位数为3。加3 小顶堆[2,3] 大顶堆[1] 中位数 3。加1 小顶堆[1] 大顶堆[] 中位数 1。

2023-09-05 11:00:01 239

原创 算法通关村十四关:白银挑战-堆能高效解决的经典问题

拿走重排的具体过程:移除堆顶元素,把下标为n的元素放到堆顶,再通过堆化的方法,将剩下的n-1个元素重新构建成堆。堆满了之后,对于小根堆,并不一定所有新来的元素都可以入堆的,只有大于根元素的才可以插入到堆中,否则直接抛弃。先遍历一遍找到最大的元素,再遍历一遍找第二大的,依次直到第K次就找到了目标值了。用大堆和小堆都可以,推荐"找最大用小堆,找最小用大堆,找中间用两个堆"因为每个队列都是从小到大排序的,每次都要找最小的元素,所以用小根堆;将根结点拿走,剩下的重排,此时根结点就是第二大的元素。

2023-09-05 10:09:32 347

原创 算法通关村十四关:青铜-堆结构

堆的价值体现大顶推的根节点是整个树最大的那个,增加时会根据根的大小来决定要不要加,删除操作只删除根元素。为什么堆的效率比较高?堆元素的数量是有限制的,一般不用将所有元素都放到堆里后面题目中可以看到,在序列中找k大,则堆的大小就是k;如果k个链表合并,那么堆就是k。堆的口诀查找:找大用小,大的进;找小用大,小的进。排序:升序用小,降序用大。口诀解释:找K大,则用小堆,后序数据只有比根元素更大时才允许进入堆。找K小,则用大堆,后序数据只有比根元素更小时才允许进入堆。

2023-09-04 16:56:38 446

原创 算法通关村十三关-白银:数字与数学高频问题

有很多解题技巧,需要持续积累。

2023-09-04 12:39:29 1737

原创 算法通关村十三关-青铜:数字与数学基础问题

尾随0的个数 = 5的倍数的个数 + 25的倍数的个数 + 125倍数的个数 + …给定一个整数 num,将其转化为7进制,并以字符串的形式输出,其中 -10^7 <= num <= 10^7。实践发现,一个数是 -100 和 -1,对符号的贡献是一样的,只需要看有多少个负数,就能判断最后乘积的符号。给定一个十进制数M,以及需要转换的进制数N,将十进制数M转换为N进制数,M是32为整数,2<=N<=16。因为2的倍数出现的次数一定是大于5的倍数出现的次数,因此我们只需要检查5的倍数的出现的次数就好了;

2023-09-04 12:08:24 377

原创 待整理-echart

提示框。

2023-08-27 20:17:34 31

原创 待整理-typescript

TypeScript是JavaScript的超集。它对JS进行了扩展,向JS中引入了类型的概念,并添加了许多新的特性。TS代码需要通过编译器编译为JS,然后再交由JS解析器执行。TS完全兼容JS,换言之,任何的JS代码都可以直接当成TS使用。相较于JS而言,TS拥有了静态类型,更加严格的语法,更强大的功能;TS可以在代码执行前就完成代码的检查,减小了运行时异常的出现的几率;TS代码可以编译为任意版本的JS代码,可有效解决不同JS运行环境的兼容问题;

2023-08-27 20:16:30 28

原创 待整理-promise

*自定义 Promise*//*Promise 构造函数excutor: 内部同步执行的函数 (resolve, reject) => {}*//*为 promise 指定成功/失败的回调函数函数的返回值是一个新的 promise 对象*//*为 promise 指定失败的回调函数是 then(null, onRejected)的语法糖*//*返回一个指定了成功 value 的 promise 对象*//*返回一个指定了失败 reason 的 promise 对象。

2023-08-27 20:12:41 26

原创 待整理-vue

vue笔记一、vue基础vue基本介绍官网 https://cn.vuejs.orgAPI 相当于字典,使用的时候可以查询下尚硅谷vue技术学习vue基础、vue-cli、vue-router、vuex、element-ui、vue3学习vue之前要掌握的知识ES6语法规范ES6模块化包管理器原型、原型链数组常用方法axiospromisevue的特点采用组件化模式,提高代码复用率,更好维护声明式编码,无需操作DOM,提高开发效率注:区分于js的命令式编码使用虚拟DO

2023-08-27 20:09:59 70

原创 待整理-Ajax

AJAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML。通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。

2023-08-27 20:06:29 17

原创 算法通关村第十二关:字符串经典基础面试题

给定两个字符串S1和S2,请编写一个程序确定其中一个字符串的字符重新排列后,能否编程另一个字符串。如果一个字符串经过重新排列后,能够变成另外一个字符串,那么它们的每个不同字符的出现次数是相同的。=> s[i]和s[j]交换,i+j = n-1 => s[i]和s[n-i-1]交换。一个接一个输出s的所有字符,当遇到一个字母时,我们希望找到逆序遍历字符串的下一个字母。第二次遍历,只要遍历到了只出现一次的字符,就返回它的索引,否则在遍历结束后返回 -1。反转每个下标从2k的倍数开始的,长度为k的子串;

2023-08-25 21:18:02 34

原创 算法通关村十二关:字符串基础

存放数字、字母、特殊字符字母有可以大写和小写常见题目类型转换,几种类型之间的相互转换转换过程中需要处理的几种特殊情况转之前先判断当前元素能不能转如果字符串转数字,要考虑当前元素是不是数字,转完之后会不会溢出。

2023-08-25 10:43:57 17

原创 算法通关村十一关:位运算高频算法题

方法1:思路分析32位二进制表示的整数,每一位进行判断,同时进行统计代码实现方法2:思路分析;运用性质,将n的二进制表示的最后一个1变成0:n&(n-1)每次执行 n=n&(n-1),n就会少一个1,可重复循环执行,直到n==0,循环次数即为1的个数代码实现总结:方法1循环次数取决于原始数字的位数,方法2循环次数取决于1的个数,方法2比方法1效率更高。

2023-08-24 16:43:11 49

原创 算法通关村十一关:位运算规则

最高位为符号位,0 整数,1 负数;二进制表示机器数对应的真正数值符号位加上真值的绝对值正数的反码:本身负数的反码:符号位不变,其余各个位取反正数的补码:本身负数的补码:符号位不变,其余各个位取反,最后+1(即在反码的基础上+1)

2023-08-23 22:54:58 29

原创 阶段总结-树与递归

两种定义形式:链表定义和数组定义二叉树的定义N叉树的定义。

2023-08-22 18:40:14 33

原创 算法通关村第十关-归并排序

归并排序(merge-sort)简单来说就是将大的序列先视为若干个比较小的数组,分成几个比较小的结构,然后利用归并的思想实现的排序算法,该算法采用经典的分治策略。分阶段,可以理解为就是递归拆分子序列的过长,递归深度为 logn,就是图中上侧的满二叉树。治阶段,需要将已经有序的子序列合并成一个有序序列,就是图中下侧的满二叉树。如上图所示,这种结构很像两棵套在一起的满二叉树。治:将分的阶段得到的各答案“合”在一起。分:将问题分成一些小的问题分别求解。

2023-08-22 11:32:26 45

原创 算法通关村第十关-数组中第K大的数字

这里还可以获得一个信息,15的索引为2,所以递增排序之后15一定是第3大的元素。如果我们要找第2大,一定要到15的右边找。如果要找第4大,一定要到15的左边找,而不需要的那部分就不用管了。从图中可以看出,15赋值为pivot,经过一轮比较后,15最终被放到属于自己的位置上,不会再变化,而15的左右两侧可以分别再进行排序。方法1:基于堆处理(暂时不懂,后续再仔细分析)这样,我们可以直接改造下快速排序的代码来实现。方法2:基于快速排序实现。方法3:基于快速排序实现。

2023-08-22 10:51:52 35

原创 算法通关村第十关-快速排序

快速排序核心:二叉树的前序遍历+对撞型双指针。

2023-08-18 21:09:36 58

原创 算法通关村第九关-二分查找与搜索树高频问题

LeetCode 852 山脉数组的峰顶索引方法1:直接遍历数组注:时间复杂度不满足要求找到下标i,满足 arr[i-1]<arr[i]>arr[i+1]优化:找到第一个下标i,满足 arr[i]>arr[i+1]方法2:二分查找对于二分的某一个位置 mid,mid可能的位置有3种情况根据mid当前所在的位置,调整二分的左右指针,就能找到峰顶方法1:直接遍历数组方法2:二分查找。

2023-08-17 19:31:15 71

原创 算法通关村第九关-二分查找:逢试必考

查找可以很简单,也可以很复杂,散列、动态规划等高难度算法都可以视为查找问题;常见的查找算法有顺序查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找、哈希查找等;二分查找、插值查找、斐波那契查找可以归为一类——插值查找。插值查找和斐波那契查找是在二分查找的基础上的优化查找算法;重要:哈希查找,二分查找凡是涉及到在排好序的地方的查找,都可以考虑二分来优化查找效率。不一定全局都排好才行,只要某个部分是排好的,就可以针对该部分进行二分查找,这是优化查找的重要途径。

2023-08-16 20:17:35 87

原创 算法通关村第八关-二叉树寻找祖先问题

最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。具体执行递归时,遍历的时候从树的根节点开始逐步向下,如某个时刻访问的节点为root,我们通过后序递归在其左右子树中查找p和q。6的祖先节点3、5,7的祖先节点3、5、2,6和7的最近公共祖先为5。

2023-08-16 12:15:48 81

原创 算法通关村第八关-二叉树的深度和高度问题

将二叉树换成了N叉数,不同点就在于N叉数的节点比较多,使用List存,最大的区别是处理子树时加了个处理List的for循环。注:这里的定义有不同的标准,LeetCode以节点数为准,根节点的深度为1,叶子节点的高度为1。高度平衡二叉树:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。二叉树的深度:根节点到最远叶子节点的最长路径上的节点数。叶子节点:没有子节点的节点。

2023-08-15 16:52:39 28

原创 算法关村第八关-二叉树经典算法

双指针,就是定义了两个变量,在二叉树中有时候也需要至少定义两个变量才能解决问题;这两个指针可能针对一棵树,也可能针对两棵树;这些问题一般是与对称、反转和合并等类型有关。

2023-08-14 21:03:21 20

原创 算法通关村第七关-二叉树中序遍历和后序遍历递归过程图

二叉树中序遍历递归算法递归过程图递归图示。

2023-08-12 15:55:10 88 1

原创 算法通关村第七关-递归:迭代实现二叉树的遍历

理论上,递归能做的迭代一定能做,但可能会比较复杂。我们用迭代法实现下二叉树的前中后序遍历。

2023-08-11 16:21:15 98 1

原创 算法通关村第七关-递归:理解二叉树的遍历

递归的方法是很难调试的,即使对的,你也可能晕,这里介绍一种简单有效的验证方法——调用过程图法。我们可以画个过程图看一下。注:面试,以及LeetCode里提供的方法可能不能直接用来递归,需要我们再创建一个方法。从二叉树的角度看递归,按照前面总结的四步分解递归法来写。最小子树 node(20) 的访问,此时访问顺序如下。LeetCode144 二叉树的前序遍历。根据,第一步和第二步组合出完整方法。向上访问,看node(3)的情况。root=None 终止。

2023-08-11 16:19:06 56 1

原创 算法通关村第七关:一图理解递归

注:递归之后可能还还有终止条件,但是在执行地柜之前,一定会有一个终止条件。上面还有个问题没有介绍,就是入参和出参怎么确定,这个没有定论,一般是根据题目要求先将能写的写出来,之后再逐步补充。对于很多人来说,递归最大的问题是给了答案也看不懂,而且递归的代码贼难调试,这里介绍一种简单直观的方法——画图法。解决这类问题最直接的方式就是枚举,将可能的情况列举一下,再逐步优化,只有列举清楚了才可能将终止条件写完整。1. 大部分递归的终止条件是n最小开始触底反弹时的几种情况,有时需要考虑的终止条件不止一个。

2023-08-11 10:31:46 48 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除