自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 动态规划|剑指 Offer II 093. 最长斐波那契数列

如果数组 arr 中存在三个下标 i、j、k 满足 arr[i]>arr[j]>arr[k] 且 arr[k]+arr[j]=arr[i],则 arr[k]、arr[j] 和 arr[i] 三个元素组成一个斐波那契式子序列。由于数组 arr 严格递增,因此 arr[i]>arr[j]>arr[k] 等价于 i>j>k。这道题说明了打表的过程是依赖状态转移方程的。把这道题的官解再次细化一下,可视化一下,这样理解起来更容易一些。

2024-07-07 22:20:59 252

原创 acwing 291.蒙德里安的梦想

根据上面的分析可以得到,一个合法的状态j,可以由很多个其他的合法状态转移而来,现在把每个合法的状态j的前一个合法状态集合求出来。状态计算:f[i,j] = ∑f[i-1,k],f[i-1,k]指的是可以到达f[i,j]的合法f[i-1]的状态。动态规划思路: 状态表示:f[i,j]表示已经将前i-1列摆好,且从第i-1列,伸出到第i列的状态是j的所有方案。结果状态:f[m,0],即前m列已经被铺满,m+1列一个格子都没有被占,即m列中没有伸到m+1列的小方块的状态。解法: 核心:先放横着的,再放竖着的。

2024-07-07 22:07:24 360

原创 最长公共子序列

但如果拿掉的是两个一样的字符,比如说都是d,即原始的两个字符串是【acbd,abedd】,拿掉末尾的d,【acb,abed】的答案是x,即【acb,abed】最长公共子串长度为x,现在在原来的字符串基础上又多了一个相同的字符,那么很自然的,最长公共子串长度应该为x+1。重新从刚才线索断掉的地方开始思考,【acbd,abedc】的尾巴一个是d,一个是c,且知道【acbd,abedc】前所有的答案,即。程序很好写,就是一个双重for循环,但是其状态转移的公式的由来是值得思考的。897. 最长公共子序列。

2024-06-29 18:23:27 404

原创 我的创作纪念日

提示:你过去写得最好的一段代码是什么?提示:当前创作和你的工作、学习是什么样的关系。提示:可以和大家分享最初成为创作者的初心。提示:在创作的过程中都有哪些收获。提示:职业规划、创作规划等​​。

2024-06-28 10:15:25 229

原创 回溯法、全排列、子集等

子集问题描述:使用集合S{1,2,3}中的元素构建新的集合,每个元素只能使用一次,元素一样的集合只算一个,eg.{1,2},{2},{1,2,3}…给定一个集合S{a,b,c},把其中元素按照不同顺序进行排序,eg.“abc”,“bca”,“cab”…其实这个子集问题的本质就是高中学到的组合问题,n个元素有几种组合方式,答案数量为C(n,m);基本思想是树(解答树)的遍历,如果是使用dfs(暴搜),那么可以使用递归来写。其实上面两个点,也是对应着高中数学里面的“排列”与“组合”先空着,有空再学再写。

2024-05-10 14:12:47 251 1

原创 二分查找入门、二分查找模板

二分查找的具体实现是一个难点,挺复杂的,可以背住一个模板,然后以后再慢慢学习。下面是y总的二分模板(比较难懂,之后再学)

2024-05-10 14:10:11 175

原创 Dijkstra求最短路径

进行第二次打表,本次打表不是从v0出发,而是从点集S出发,求得S到各点的最短距离,将距离最短的点更新加入S,然后不断重复,直到目标点被添加入点集S时,结束,此时找到最短路径。详见青大王卓课程:https://www.bilibili.com/video/BV1nJ411V7bd?从源点v0出发,求得到其余所有点的距离,打成第一张表,然后以此表为依据,寻找距离v0最近的点,将该点加入到v0的点集S中;利用了广度优先搜索,使用贪心思想,不断扫描各点距离源点的距离,然后将最短距离保存,直到所有点扫描完毕。

2024-05-07 22:40:55 302

原创 kmp之next函数实现与测试

【代码】kmp之next函数实现与测试。

2024-04-15 20:30:37 125

原创 浮点数加法

浮点数有时候计算结果会出现长尾小数,例如0.1+0.11=0.21000000000002,这种结果很麻烦。用包装类就可以轻松的解决这个问题,不过想着很久没写加法了,高精度加法也不咋写了,自己造下轮子熟悉一下算法,于是就写了个浮点数的加法,原理就是小学加法。

2024-03-18 22:53:22 257

原创 Java、GO、C++语法比较

Java:int[] arr, int arr[]都行,不过建议前者,后者是c-style。c++: *int 指针传递,&int 引用传递,int 值传递。go:arr := make([]int,0),只能在前面。c++:int arr[],只能这样,放前面会报错。go: *int 指针传递传递,int 值传递。2.声明数组(切片)方括号位置。3. 函数传递参数不同。

2024-03-06 22:34:38 221 1

原创 datagrip 使用自定义参数

1. 直接打问号❓,执行的时候会问你这个问号填什么。格式:${xxxx} xxxx是你定义的参数名字。2. 设置参数,执行的时候会问你这个参数填什么。执行就会问你这个参数填什么,定义过会保留。

2023-11-02 18:01:38 837

原创 GO|经典错误之回车与\n

Linux系统里面回车是\n,但是Windows里面是\r\n,因此如果是使用 input = input[:len(input)-1]的方式去掉delim,那就会出错了,因此还是要使用相应的工具包才好,即使用。明明没有什么问题,然后把这段代码放到online go的网站上去跑,输出的是99。这个\r\n是啥, 搜了一下,是Windows系统里面的回车,好家伙,原来问题出在这里了。运行,输入99,回车,输出0。

2023-09-02 14:30:48 776

原创 数据链路层是什么?

数据链路层承接上层的数据,然后使用下层提供的,按照一定的规则,进行数据传输。物理层提供了传输媒体与连接(信道)(数据链路层使用的信道通常是物理层提供的信道),即提供了比特流动的可能性,但是杂乱无章的比特并不是信息,数据链路层需要将上层给予的数据信息组织起来,按照一定规则发送与接收。

2023-08-14 12:46:23 203

原创 及时、完善的测试的重要性

后来换个方向,去看被调用的模块,才发现被调用的模块里面有一个配置的错误,这个错误在这个模块做接口级别的测试的时候是无法发现的,而我写这个模块的时候很着急,只做了接口的测试。具体来说,这个项目使用的是ssm框架,需要进行大量的配置,而配置内容基本上都是差不多的,因此我在对某个模块进行一些框架、中间件的配置的时候,直接从原来项目中复制了过去。去年开发某个项目的过程中遇到过一个bug,让我印象深刻, 因为花费了一个下午的时间才解决,而导致bug的原因却非常的基础,并不是什么难的问题,就是配置错了而已。

2023-08-12 22:48:42 271

原创 八股|ThreadLocal的内存泄露

ThreadLocal为什么可能导致内存泄露?答:由于存储的value并不是存在ThreadLocal对象之中,因此ThreadLocal对象被回收后,value可能无法被回收,这样就造成了内存泄露。

2023-06-14 14:31:04 2536

原创 虚拟机角度下的线程

一个 Java 应用通常是一个进程,这个进程就是jvm,编译好的class文件丢到jvm中,执行时就成为了诸多线程(网络请求过来时,也会生成相应的线程去处理请求)。当运行一个 Java 程序时,操作系统会创建一个 JVM 进程,该进程会解释和执行 Java 代码,从而运行您的程序。 ——我们编写的Java程序运行在一个jvm上面,一个jvm囊括了所有的线程,所有的需求都是由线程完成的。

2023-06-11 12:41:15 806

原创 Java中线程的生命周期

只是普通的进入到了延时等待状态,wait和join会释放锁,所以他们进入等待状态后,还是可能进入阻塞状态的。至于各个状态之间如何转换,这里先不写了,二次复习的时候再深入。其中RUNABLE包含了OS中的执行与准备这两个状态。稍微复杂点:(这张图画的大致正确)

2023-06-11 12:30:31 555

原创 jvm|什么是Java虚拟机?

从OS角度去看,虚拟机就是一个进程,一个软件,我们所有的java程序都是跑在这个软件上面的,这个软件会发出机器指令给操作系统,然后达到操作硬件的目的。既然是一个软件,那么这软件就是跑在内存上面的。里面的栈、堆、方法区等等概念,都是这个软件在内存上自我划分的概念,而不是操作系统划分的概念,因此这台机器叫做虚拟机,是虚拟出来的一台机器,在OS看来,这就是一个平平无奇的进程。上面讲到把JVM放入内存中,好像就像画的那样JVM直接占内存条的一段,其实不是这样的,这是抽象的表示方法,是为了忽略掉与整体无关的细节。

2023-06-04 22:42:04 87

原创 JVM|什么是符号引用?

在Java中,符号引用(Symbolic Reference)是指用一个符号来代替目标引用的一种引用方式。它包括了两个部分:符号引用和解析。符号引用是指在Java类中通过类、方法、字段等名称来引用其他类、方法、字段等的方式。在Java源代码中使用的类名、方法名、字段名等都属于符号引用。符号引用是一个字面量,它可以被存储在类或者方法的常量池中,而不需要提前解析。解析是指在运行期间将符号引用转换为实际的内存地址的过程。

2023-04-21 15:42:57 2385 1

原创 JVM|为对象分配内存空间的流程

为对象分配内存空间的流程,有图,很详细

2023-04-18 17:36:10 377

原创 软件工程|为什么需要统一处理异常?以及如何处理?

后端开发人员可以简单的明白请求是非法的,并察觉到了是因为非法请求导致程序抛出了异常,这是由于开发者熟悉程序的细节,知道为什么程序会跑到这个异常的位置,但是对于运维和前端人员,他们看到了日志里记录专业化(开发化)的异常报错,有时是难以理解的,这对于团队代码开发是不利的。开发是一个持续的过程,在这个过程中总能碰到相似的、同类的异常,如果为了每种异常都去写一个自定义异常,为每种异常去写专门的前端响应,那将会增加开发的复杂程度,而且事倍功半,不利于后期维护。将异常统一起来管理,这是会方便开发的。

2023-03-27 20:23:41 216

原创 debug|freemarker的InvalidReferenceException处理

读了读下面的报错,基本上明白错误的地方了:就是我用于生成模板的数据,有些是空字段,而这个我并没有设置,因此模板引擎报错了。知道这个错误后事情就简单了,要么设置空字段默认值,要么传入的值不能为空即可。好的,百度一下这个异常咋回事,一搜,说是模板里面的放的值不能为空,好家伙,不能为空啊,那读读报的错是不是这个意思呢?密密麻麻的,真让人头疼,先检查下环境配的对不对好了,xml配置、模板地址啥的,检查后发现没问题,那进入到第二步,检查下具体异常是啥;首先找下抛出的异常是啥,

2023-03-08 15:39:08 1669

原创 什么是web框架?

我们解释一个概念的时候,通常会用到其他更多的概念去解释它,如果听的人不理解解释它的概念,那么这个解释是失败的,因此首先要回答一下解释web框架中所用到的概念。回答这个问题前,首先需要需要回答如下子的问题:什么是服务器应用;如何编写web程序;软件框架的概念以bs架构为例子解释。浏览器、服务器构成的b/s软件架构风靡全球,b为浏览器,s为服务器。

2023-02-24 17:28:53 2972 1

原创 基础图算法|prim算法的Java实现

prim算法的Java实现

2023-02-11 19:30:26 220

原创 算法基础|prim算法的实现

prim算法的实现,比较代码风格偏工程,看着复杂,其实还是很简单的。。

2023-02-07 17:01:26 82

原创 算法基础|迪杰斯特拉算法初次实现|DijkstraAlgorithm

迪杰斯特拉算法

2023-02-03 16:18:17 144

原创 图|AcWing 846. 树的重心

在树中:有n个结点,则有n-1条边,由于用图的方式表示树,也要在意每条边的方向,由于每条边两个方向,因此一共最多2*(n-1)条边,方便起见开2N条边。这里的e存储的是边,一个e对应着一个有向边。j = e[i],代表着i这个点到j有条边。由于是树,肯定存在i = e[j];算法不难理解,实现比较麻烦,sum与res的使用很巧妙,是一个工具写法,可以背下来。学习静态链表写法对于找工作有什么意义呢?由于是双向的,所以e得开2N,ne也是如此。2023年2月2日17:17:53。

2023-02-02 19:05:42 108

原创 动态规划|188. 买卖股票的最佳时机 IV

dp[i][j][1]代表第i天时,第j次买卖时持有股票时的收益;dp[i][j][0]代表第i天时,第j次买卖时持有股票时的收益。

2023-01-16 15:08:44 155

原创 动态规划|121. 买卖股票的最佳时机

由于标签中说这道题可以用动态规划去做,那么根据动态规划题目的规律,最后的答案肯定是dp[i]之类的,这个i大概率是天数,也就是维护第i天的最大盈利。上面讲到了,对于i天,只有两种状态——持有股票或者不持有,因此将dp[i]扩展一下,扩展成dp[i]{0,1},dp[i][0]代表第i天不持有股票时的最大收益,dp[i][1]代表第i天持有股票时的最大收益。由于我不是计算机或者数学的天纵奇才或者大罗神仙,没法凭空想出一些绚丽的转移方程,然后一步优化到位,因此我只能通过简单的做法一步一步蚕食这道题目。

2023-01-13 16:40:00 708

原创 动态规划|474. 一和零

刚开始的时候,我是把k循环放到最里面去的,跑出来的结果很大,而且一个都不符合,分析了一下发现如果把[k]放到最内层去遍历,会导致重复使用,因此【k】必须是最外层的循环。像极了中学时代的那种看上去花里胡哨,实质上是根据考点设计出题的题目。题目看上去很唬人,但是恰恰是这样说明该题设计的目的很强,指向dp的01背包,就是为了考01背包设计的。其中:k表示候选元素的范围,(i,j)表示0与1的上限个数。既然有了转移方程,那么该如何遍历呢?为什么说是考察01背包,中描述的很清楚,不赘述。

2023-01-10 14:49:47 310

原创 动态规划|剑指 Offer II 101. 分割等和子集

找个问题可以放大一点,转化为:nums是否存在子集Q,这个Q的所有元素加起来等于一个tar(tar是一个任意的给定的正整数)。题目给了一个数组nums,要求说是在数组里面找个一个子集,找个子集的和与剩下的元素组成的子集的和相等。在这个问题中,当tar=sum/2时,就是该题目原本的解答了。一些前提条件判定的分析就不写了,比如说sum必须为偶数, halfSum > maxNum啥的。相当于:一个集合N,是否存在一个子集Q,sum{Q} = sum{N-Q}简洁的说法:nums设为集合N,N是否存在子集Q,

2023-01-06 17:10:59 353

原创 剑指 Offer II 097. 子序列的数目--Java

代表字符串的子串,这个子串从头开始直到i个字符,eg. str=“1234”,str[:3]意义就是"123"(严格意义的比较,不仅是字符相等,还得是所在位置的一致)。既可以是合法子串的末尾元素,也可也不是,因此这两种情况都要考虑。是b,而这个b可以由s[2]或s[3]或s[4]满足)集合划分:这群相同的子序列中,最末元素是否是。个字符串的动态规划问题,一般就是二维dp,相同的子序列,属性为数量。时,处于【不是s[i]】分别代表一个字符串。的中的合法子串数量和。的中的合法子串数量和。相等,既然如此,那么。

2023-01-06 10:45:48 272

原创 动态规划|AcWing 901. 滑雪

因此对于该题目,首先是理解怎么一回事,然后去体会记忆化递归的妙处,然后再去多做相似、相关类型的题目,对递归、计划化搜索熟悉后再回来看这道题,常看常新。使用二维数组记录,从某个点出发时的最长距离,这样当想要得知点(i,j)最长距离时,只要比较点(i,j)上下左右四个点哪个点最大即可。1.只能从高处向低处滑行,这个条件保证了从f(i,j)递归时不会重复走到f(i,j)。对于只学过一点算法的入门者而言,想要通过自己写出题解中的递归难度是非常大的。,想要通过这一道题完全掌握该题要考察的知识点是不可能的。

2023-01-03 15:38:25 255

原创 动态规划|285. 没有上司的舞会

原本不想写题解的,因为难度确实不大,但是阳了之后逻辑能力被严重耽误,很那思考多一些的东西,感觉大脑的“内存”不够了,遂借助文章的形式梳理一遍题目,顺便写下来充实博客。:根据题目,观察可知,父结点的状态,可以由子结点转移过来,这样一来,就可以使用dfs的方式遍历整个树,然后进行比较root结点两个状态中那个最大即可。当结点i不取值时,其子节点们就可以取值了,这样一来,i结点的最大值为其所有子节点最大值的和(取值或者不取值~);因为树上每个结点都是可以一个状态的集合,当做状态来去转移,也就可使用动态规划了。

2022-12-27 17:46:35 326

原创 动态规划|最短Hamilton路径

2022年12月22日11:23:10“n个点,从0开始,到n结束,求涵盖所有点的最短路径”有n个点,有n!条路径可以选择,不过题目中要求是0开始,n-1点结束,因此一共是(n-2)!条路径,在(n-2)!条路径中选择一条最短的路径即为答案,但是时间复杂度太高了。使用动态规划来减少重复。设w[][]为图的邻接表,用以表示点与点之间的权值;f[j]为终点为j时的所有路线的集合(起点先不关注),而终点为j时,前面点的数量还是没有确定的,需要进行确定才可以进一步减少集合的范围。此时引入一个路径状态。

2022-12-22 11:41:45 610 1

原创 动态规划|石子合并——遍历顺序的思考(Java)

其中f(i,j)依赖的前面数据是图中标出的蓝色与绿色部分,因此使用常见的双循环遍历的时候,就会因为无法获得绿色部分数据而出错,避免这种情况可以使用倒叙遍历,就是倒着遍历,从下往上,从左往右,这样就可以满足转移时对前文数据的依赖。而通过长度进行遍历的方式本质上是斜着遍历,即下图中蓝色、绿色、黄色、红色的遍历顺序,这样遍历,每次用到前面的数据的时候,上一次遍历都已经准备好了。

2022-12-18 22:55:32 187

原创 debug|在oj上使用java,报错Non Zero Exit Code的一次debug

/这种写法oj上过不去。这样写才可以,我没去细究为什么会这样,等oj用熟了再去了解下原因。

2022-12-16 16:42:56 550

原创 排序|快速排序的简单实现

其实很简单,把比x小的数都放到x的左边,把x数大的数都放到x的右边,此时x在数组的下标为i,这个i其实和数组排序后x所在的位置是一样的。也就是说这个分组操作之后,就将x的位置排好了。而且也将数组更加的有序化了。至于如何分组,可以使用一种朴素的实现方式,那就是直接创建两个数组a与b,用以存储大于等于x的数和小于x的数。至于x,不放入数组中,或者放入a中最末尾。其实漏掉了一个重要的东西,就是x的位置在分完之后代表着什么,有什么意义?很多教程里面讲到,这个函数需要把数组分成一边大于某数x,另一边小于x。

2022-11-29 11:08:39 234

原创 算法题|剑指 Offer II 038. 每日温度

单调栈很简单,就是在栈的基础上进行了一些改动,让每个入栈元素都与栈顶元素进行比较,如果入栈元素大于栈顶元素,栈顶元素则弹出,直至空栈或者栈顶元素大于入栈元素(也可以反过来,单调增或单调减都可以的)。这样就能表现一个特别的效果,即从栈底到栈顶呈现出单调的特性,栈底也保存着当前最大(或最小)的元素,入栈元素是弹出栈元素左边第一个比它大(或小)的元素,等等。这道题是很好的一道单调栈的练习题,感觉并不是有问题然后再出现解答,而是根据单调栈这个数据结构设计的题目。也就是说是跟着一个答案寻出了一道题目。

2022-11-08 19:14:38 92

原创 算法题|滑动窗口的最大值

校核方式为:查看元素中堆顶元素是否属于滑动窗口的范围内,查看的方法为比较堆顶元素下标是否大于滑动窗口左指针下标(i-k)。如果堆顶元素不在滑动窗口范围内,则弹出该元素,重复校核新堆顶元素,直至堆顶元素满足校核要求。每加入一个元素,视为滑动窗口向右移动一格(此时滑动窗口右指针为i),每次加入元素对该优先队列进行校核。官解第一种方法使用的优先队列,这个方法我觉得很妙,于是补充一下细节,加深对题目的理解。输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3。

2022-10-18 14:42:24 281

空空如也

空空如也

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

TA关注的人

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