- 博客(87)
- 收藏
- 关注
原创 【动态规划】-- 解码方法
状态转移方程:dp[i] = dp[i - 1] + dp[i - 2](注意:这里的dp[i - 1] 和dp[i - 2]不一定都存在)。已编码的消息时,你意识到有许多不同的方式来解码,因为有些编码被包含在其它编码当中(dp[ i ] 表示:以 i 位置为结尾时,解码方法的总数。如果没有合法的方式解码整个字符串,返回。注意,可能存在无法解码的字符串。的消息通过以下映射进行了。题目数据保证答案肯定是一个。根据最近的一步来划分问题。以 i 位置为结尾,…返回dp[n - 1]
2025-03-26 13:03:49
433
原创 【动态规划】-- 使用最小花费爬楼梯
状态转移方程:dp[ i ] = min(dp[i - 2] + cost[i - 2],dp[i - 1] + cost[i - 1])状态转移方程:min(dp[ i + 1] + cost[ i ], dp[i + 2] + cost[ i ])用之前或者之后的状态推导出dp[ i ]的值,根据最近的一步,来划分问题。dp[ i ] 表示:从 i 位置出发,到达楼顶,此时的最小花费。dp[ i ]: 表示到达 i 位置的最小花费。返回min(dp[0],dp[1])经验:以 i 位置为起点,…
2025-03-25 23:11:45
998
原创 【动态规划】-- 三步问题(easy)
有个小孩正在上楼梯,楼梯有 n 阶台阶,小孩一次可以上 1 阶、2 阶或 3 阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模 1000000007。dp[ i ] 表示:到达 i 级台阶有dp[ i ] 种方法。以 i 位置的状态,最近的一步来划分问题。经验 + 题目要求:以i位置为结尾,…
2025-03-25 22:28:36
354
原创 【动态规划】-- 第N个泰波拉契数
根据上面我的根据题意得出的状态转移方程,在填0位置的dp表时,会出现dp[ - 1 ]、dp[ - 2 ]、dp[ - 3 ],此时就会越界, 同理,在填1位置和2位置时也会出现越界的问题。本题的状态转移方程:dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ] + dp[ i - 3 ]【分析】:在求n位置的状态时,只需要该位置前三个的状态表示,那么其余的前面的状态表示都是多余的。在填写dp表时,仅需要所求状态的前面的部分状态表示,这样的都可以使用滚动数组来进行空间优化。
2025-03-25 21:39:02
624
原创 【前缀和】-- 除自身以外数组的乘积
想求 i 位置的最终结果的时候,需要求[0,i-1] 和 [i + 1, n - 1]的乘积。g[i] :表示 [i + 1, n - 1]区间内所有元素的积。f[i] : 表示[0,i-1]区间内所有元素的积。边枚举位置,边从头开始遍历数组然后求乘积。时间复杂度0(N ^ 2).f : 表示前缀积。g : 表示后缀积。
2025-03-18 13:44:26
292
原创 【JavaEE】-- SpringBoot快速上手
Maven是一个项目管理工具。基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。大白话:Maven是一个项目管理工具,通过pom.xml文件的配置获取jar包,而不用手动去添加jar包,maven就跟预制菜是一个道理。通过pom.xml文件的描述来管理一个项目的构建。spring就是一个框架,是一个半成品,把一些项目公共的部分抽取出来。观察pom文件<build><plugins>
2025-03-18 12:01:41
939
原创 【JavaEE进阶】-- HTML
HTML(HyperTextMarkupLanguage),超文本标记语言。**超文本:**比文本要强大.通过链接和交互式方式来组织和呈现信息的文本形式.不仅仅有文本,还可能包含图片,音频,或者自已经审阅过它的学者所加的评注、补充或脚注等等。**标记语言:**由标签构成的语言。HTML的标签都是提前定义好的,使用不同的标签,表示不同的内容,类似word文档:如果选中文本,点击标题1,就会使用标题1的样式来显示文本,上述标题1就是一个"标签”。
2025-03-16 19:48:39
957
3
原创 【二分算法】-- 寻找峰值(medium)
给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。解释:3 是峰值元素,你的函数应该返回其索引 2。输入:nums = [1,2,1,3,5,6,4]解释:你的函数可以返回索引 1,其峰值元素为 2;从第一个位置开始,一直向后走,分情况讨论即可。峰值元素是指其值严格大于左右相邻值的元素。输入:nums = [1,2,3,1]或者返回索引 5, 其峰值元素为 6。你必须实现时间复杂度为。的算法来解决此问题。时间复杂度:0(N)
2025-03-15 23:47:21
292
原创 【模拟】-- 替换所有的问号
【思路】:从前往后遍历该数组,如果遇见问号就将该问号替换成不等于该元素两边的元素即可。【细节】:当在字符串的头或者尾是问号时,我们无需判断前一个或者后一个字符是否有重复。特点:思路简单,考察的是代码能力。模拟算法–> 比葫芦画瓢。
2025-03-14 08:30:00
249
原创 【前缀和】-- 二维前缀和
根据给出的q次查询的坐标,直接进行遍历然后求和。遍历q次,时间复杂度为0(n * m * q)dp[i][j] 表示:从[1, 1] 位置到[i, j]位置,这段区间里面所有元素的和。假设[x1, y1] ~ [x2, y2]
2025-03-13 10:15:00
1047
原创 【前缀和算法】-- ⼀维前缀和(easy)
答:如果从0开始计数的话,在使用dp[right] - dp[left - 1]这个公式求解时,就会出现数组越界的情况。根据输入的q行,根据输入的每一行的区间,从前往后遍历求和,就这样求解q次,时间复杂度是0(q*n)。我们可以得出快速求dp[i]的递推公式:dp[i] = dp[i-1] + arr[i]创建一个数组dp,dp[i] 表示:表示[1, i]区间内所有元素的和。,时间复杂度是0(1),在这道题中可以直接将时间复杂度降为0(q)。问:为什么下标要从1开始呢?前缀和这个算法就是用来。
2025-03-13 09:00:00
377
原创 【二分算法】-- 搜索插⼊位置(easy)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。我们可以将数组元素分为两部分,左边一部分是<targe的部分,右边一部分是>=target的部分,这就是这道题中存在的。输入: nums = [1,3,5,6], target = 5。输入: nums = [1,3,5,6], target = 2。输入: nums = [1,3,5,6], target = 7。请必须使用时间复杂度为 O(log n) 的算法。
2025-03-12 12:00:00
741
原创 【二分算法】-- ⼭峰数组的峰顶(easy)
【二段性】:在这个折线图中,我们发现元素被天然的分成了两部分。左边的一部分的特点是:从第二个元素开始所有的元素都是大于前一个元素的;右边一部分的特点是:从蓝色框框最左边的元素开始是严格小于前一个数的。定义一个指针从起始的位置开始,若是指针指向的元素小于后一个元素,那么指针指向的该元素就一定不是峰值;当扫描到第一个数大于后面的元素时,就是我们要查找的峰值。【时间复杂度】:最差的情况就是在数组的倒数第二个元素找到峰值,时间复杂度是0(n)。首先,左右两个端点处的元素一定不是我们要找的峰值。
2025-03-12 10:00:00
374
原创 【二分算法】-- x的平⽅根(easy)
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5。此时,我们就可以将其分成两个区间,左边是平方后<=x的,右边是平方后<x的。解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去。给你一个非负整数 x ,计算并返回 x 的 算术平方根。我们假设ret那个位置就是我们要返回的结果。
2025-03-11 17:08:06
319
原创 【二分算法】-- 在排序数组中查找元素的第⼀个和最后⼀个位置(medium)
当left 和right都指向ret时,此时是处于>=target的区间的,选择语句会执行right = mid的操作,此时right没有变,那么我们再次进入循环求mid的时候,求的还是之前的值,一直不会变,就会陷入死循环,不能将循环条件写成left <= right 这个就是一个重要的原因。当nums[mid] >= target 时,我们的mid所指向的位置有可能是区间的左端点,所以我们不能将right更新成right - 1,这样会有可能跳过我们的最终结果。所以,我们要将 left 更新成mid.
2025-03-11 11:48:52
986
原创 【二分算法】-- 三种二分模板总结
如果是三分的话,我们就像是在赌,如果赌对了,那么就直接舍弃掉三分之二的数据,但是如果失败了那么就只能舍弃掉三分之一的数据。二分算法是最恶心,细节最多,最容易写出死循环的算法====但是,一旦掌握了之后,二分算法就是最简单的算法。其实并不是一定要二分,三分,四分也都可以,但是根据概率学中的求期望数学中可知,二分是效率最高的。实际情况是,只要能发现一些规律(二段性)就能使用二分算法。------>理解之后再记忆。只有在数组有序的情况下才能使用二分算法(×)。
2025-03-10 18:37:55
979
原创 【数据结构】-- LinkedList与链表(2)
LinkedList的底层是双向链表结构(链表后面介绍),由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。在集合框架中,LinkedList也实现了List接口,具体如下:【说明】LinkedList实现了List接口LinkedList的底层使用了双向链表LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问。
2025-03-10 17:49:59
923
原创 【数据结构】-- LinkedList与链表(1)
快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表起始位置开始运行,如果链表带环则一定会在环中相遇,否则快指针率先走到链表的末尾。链表是一个一个的称为 节点的对象组成的。这个节点至少有两个域,一个是value域(用来存放数据的),还有一个叫做next域(存放节点对象的地址)。现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。
2025-03-09 23:30:49
898
原创 【JavaEE】-- 多线程(初阶)4
阻塞队列是⼀种特殊的队列.也遵守"先进先出"的原则.阻塞队列能是⼀种线程安全的数据结构,并且具有以下特性:• 当队列满的时候,继续⼊队列就会阻塞,直到有其他线程从队列中取⾛元素.• 当队列空的时候,继续出队列也会阻塞,直到有其他线程往队列中插⼊元素.阻塞队列的⼀个典型应⽤场景就是"⽣产者消费者模型".这是⼀种⾮常典型的开发模型.//定义一个数组来存放数据,具体的容量由构造方法中的参数决定//定义头尾下标//定义数组中元素的个数//构造。
2025-03-04 22:06:08
783
1
原创 【JavaEE】-- 多线程(初阶)3
其实理论上wait和sleep完全是没有可⽐性的,因为⼀个是⽤于线程之间的通信的,⼀个是让线程阻塞⼀段时间,唯⼀的相同点就是都可以让线程放弃执⾏⼀段时间.对于线程t1来说,只是比较flg这个变量的值,从来都没有修改过,所以CPU认为,这个值永远也不会改变,从而也不会重新从内存中读取值。t2线程正常结束,并且已经修改了flg变量的值,但是t1没有结束,整个进程也没有结束,结果不及预期,线程安全问题产生。当某一个处理器往主内存中写回数据的时候,让缓存中的值失效,通知其他处理器从主内存中重新获取新的值。
2025-03-02 09:42:08
640
原创 【测试】-- Bug
⼯作中开发⼈员通常需要按照bug的级别来分配优先级来处理bug,除此之外,通过bug级别也能够体现出开发⼈员的开发质量。测试⼈员在执⾏测试的过程中如有发现bug,需要在对应的bug管理平台来创建bug(bug⽣命起源),创建好的bug需要被开发⼈员修复,以及测试⼈员的持续跟踪和测试。在测试⼯作中,最常遇到的是和开发⼈员的PK,作为测试经理还会和项⽬经理、产品经理的PK进度、质量。在工作中,开发人员创建的bug不一定是有效的,也可能是误操作导致的无效bug,无效bug在一定程度上反映了个人的测试能力。
2025-03-01 19:20:08
1157
原创 【滑动窗口算法】-- 将x减到0的最小操作数
由于这道题标注了所有数据都是大于1的,所以right是不用回退的,但是如果元素中有负数,那么我们就需要让right回退回去,因为如果元素中有负数的话,我们的tmp在right右移的时候,tmp的结果就不能是一直递增的了。那么如果此时tmp恰好等于target的话,我们就可以记录下left到right之间的元素个数,然后让left右移,继续往下面找符合条件的区间。我们把求最小两头之和转换成求最大中间之和,只要在数组的区间中找到一个最大的子区间,使得子区间的总和为 sum - x,sum是整个数组元素的总和。
2025-03-01 14:09:25
459
原创 【滑动窗口算法】-- 最大连续1的个数
但是由于right左边的区域,无论以谁作为left的起点,最长的长度也就到此时right的位置,所以我只需要让left一直向前,我们做是否为0的判断,right也无需回退。直到right走到上图的位置,right所对应的位置是0,zero需要再次+1,就大于了给定的k值,此时就要记录下来“最大连续1的个数”。接下来,如果按照暴力枚举的方法,那么left来到下一个元素,right 就要回退到left所在的位置。和一个整数 k,假设最多可以翻转 k 个 0 ,则返回执行操作后 数组中连续 1 的最大个数。
2025-02-27 20:36:59
416
原创 【滑动窗口算法】-- 无重复字符的最长子串
并且,我们的right也无需回退,我们已经判断过前面的字符,并且将重复字符跳过了,所以在left 到 right 的区间里是没有重复字符的。一直走到上面图片的位置,出现了一个重复字符a,此时,我们就找到了以第一个字符d开头的最长不重复子串。但是其实我们可以发现一个小规律:以重复字符以前开始的子串,最长也就是到right此时的位置。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。解释: 因为无重复字符的最长子串是。
2025-02-27 09:17:03
515
原创 【滑动窗口算法】-- 长度最小的子数组
首先定义两个指针 left 和 right ,分别指向数组下标为0的位置,并定义sum(记录窗口内所有数的总和) 和 len(记录最小子数组的长度)。如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。如果不存在符合条件的子数组,返回 0。解释:子数组 [4,3] 是该条件下的长度最小的子数组。找出该数组中满足其总和大于等于。个正整数的数组和一个正整数。时间复杂度是O(n^2)。的长度最小的 子数组。
2025-02-25 14:44:46
304
原创 【双指针算法】-- 三数之和(Java版)
*补充:**如果当i固定到正数时,由于我们已经给数组排完了顺序,这就意味着我们要在后面的区间里找到两个整数的值等于一个负数,很显然这是不现实的,所以,题目给出的实例中有这三种组合满足需求,题目中的正确输出结果是两种,根据这个情况,我们理解到不重复的意思是:输出的顺序和三元组中三个元素的顺序不重要。此时,这一轮就结束了,我们接下来还要往后移动i的位置,继续找,但是我们在移动i的位置时,我们也要跳过相同的数字,来保证。这时,left + right = a,此时我们不能停止,要继续缩小区间往后找,保证。
2025-02-25 10:11:15
1269
原创 【双指针算法】-- 和为s的两个数字(Java版)
此时 left+right 小于 target ,因为数组是有序的,right 左边的数字都比 right 小,left + right 小于 target ,那么right 左边的数字加 left 更不可能等于 target。此时 left + right 大于target ,根据有序数组的单调性,left 右边的数字比 left 大,right + left 右边的数字只会更大,所以我们也是省略不算,以此来达到优化。以下面一组数为例,我们定义两个指针left 和 right ,分别指向数组的头尾。
2025-02-24 19:38:28
417
原创 【双指针算法】-- 有效三角形的个数(Java版)
我们判断三条边能不能组成一个三角形,根据我们的知识的话肯定想到的是三角形的任意两边之和大于第三边,但是如果我们要判断三次的话,未免就有些麻烦,所以我们有一个判断三条边是不是三角形的判断方法有一个是:如果三条边较短的两条边之和大于第三边,那么这三条边就可以组成一个三角形。这道题我们首先想到的也是暴力枚举的方式,但是如果是暴力枚举的话,我们要使用三层for循环,时间复杂度为O(n ^ 3),肯定是超时的,所以我们要找一个较为优化的方法。此时9和所有数的结合都已经考虑到,我们让right向左移动一位。
2025-02-24 17:58:13
571
原创 【测试】-- 概念篇
在多数软件公司,会有两部分需求,⼀部分是用户需求,⼀部分是软件需求。开发模型实际上指的是开发一款软件/功能需要具备的开发流程。
2025-02-24 14:01:48
1240
原创 【JavaEE】-- 多线程(初阶)2
后一个线程永远读到的是上一个线程刷回主内存的值,主内存相当于一个交换空间,线程依次写入和读取,而且是串行(顺序执行)的过程,通过这样的方式实现了内存可见性,并没有对内存可见性做技术上的处理。线程A拿到了锁,别的线程如果执行被锁住的代码,必须要等到线程A释放锁如果线程A没有释放锁,那么别的线程只能阻塞等待,这个状态就是BLOCK。程序运行的结果和预期值不一样,而且是一个错误的结果,但是我们的程序逻辑是正确的,这个现象所表现的问题称为。已经获取锁对象的线程,如果再进行多次的加锁操作,不会产生互斥现象。
2025-02-23 14:37:02
925
原创 【JavaEE】-- 多线程(初阶)1
并不是任何时候多线程的效率都要比单线程高,当任务量很少的时候,单线程的效率可能会比多线程更高,创建线程本身也会有一定的系统开销,这个开销没有创建进程的开销大,两个线程在CPU上调度也需要一定的时间。线程中具体的任务是打印一句话,所以线程中的大部分时间是在休眠,也就意味着线程是在休眠的时候中断的,所以就是中断的休眠状态下的线程,而不是执行线程任务的线程。两个线程同时进行,互不干扰,线程的执行顺序没有什么规律,这个和CPU调度有关,由于CPU调度是抢占式执行的,所以哪个线程占用当前CPU资源是不确定的。
2025-02-11 09:42:38
664
原创 【JavaEE】-- 计算机是如何工作的
进程是操作系统对⼀个正在运⾏的程序的⼀种抽象,换⾔之,可以把进程看做程序的⼀次运⾏过程;同时,在操作系统内部,进程⼜是操作系统进行资源分配的基本单位。*每一个运行的程序在操作系统里都对应着一个进程。*程序安装完之后,在系统中都是静态文件存放在磁盘中,双击之后,从磁盘加载到内存,系统就会创建一个这个程序对应的进程,这时程序就运行起来了。进程可以分为:前台进程(用户执行的进程);后台进程(系统创建的进程)。操作系统本身也是一个程序,它也创建了很多进程。
2025-01-25 12:25:17
2154
空空如也
在VS上运行代码时,出现这个,是什么意思,应该怎么解决?
2023-12-17
TA创建的收藏夹 TA关注的收藏夹
TA关注的人