自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Day53|动态规划part14: 1143.最长公共子序列、1035. 不相交的线、53. 最大子序和

这题有点像递增子序列和公共子数组的组合, 要求公共子序列不一定非要是连续的。dp[i][j]表示text1[i - 1]与text2[j - 1]结尾的最高公共子序列。长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]最后返回的结果是**dp[text1.length()][text2.length()],**因为这里不相等并不是推倒重新再来,因此遍历到最后一定是最大的。

2024-04-27 10:53:04 92

原创 Day52|动态规划part13:300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

举个例子A[0]如果和B[0]相同的话,dp[1][1] = dp[0][0] + 1,只有dp[0][0]初始为0,正好符合递推公式逐步累加起来。但dp[i][0] 和dp[0][j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。如果A[i-1] 和B[i - 1]相同,dp[i][j] = dp[i - 1][j - 1] + 1。

2024-04-26 15:36:14 243

原创 Day27:阻塞队列、Kafka入门、发送系统通知、显示系统

阻塞队列BlockingQueueBlockingQueue解决线程通信的问题。阻塞方法:put、take。生产者消费者模式生产者:产生数据的线程。消费者:使用数据的线程。(Thread1生产者,Thread2消费者)实现类ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue、SynchronousQueue、DelayQueue等。@SpringBootTest@ContextConfiguration

2024-04-25 23:06:57 646

原创 Day51|动态规划part12:309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

【代码】Day51|动态规划part12:309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费。

2024-04-25 13:43:35 179

原创 Day50|动态规划part11:188.买卖股票的最佳时机IV、123. 买卖股票的最佳时机III

这题限制更多了,改成买卖两次,可以买卖一次也可以买卖两次,选择更多了。有点蒙,直接看题解,dp五部曲。

2024-04-24 10:15:58 344

原创 Day26: Redis入门、开发点赞功能、开发我收到的赞的功能、重构点赞功能、开发关注、取消关注、开发关注列表、粉丝列表、重构登录功能

例如,如果 System.currentTimeMillis() 返回 1633024800000,那么这表示从 1970 年 1 月 1 日 00:00:00 GMT 到现在已经过去了 1633024800000 毫秒。这个方法常常被用来测量代码的执行时间,或者生成一个唯一的时间戳。在 Redis 中,如果在设置键值对时没有显式地指定过期时间,那么这个键值对将会一直存在,直到被显式地删除或者当 Redis 内存不足需要淘汰数据时被自动删除。,在这个回调中,它启动一个Redis事务,然后执行一系列的操作。

2024-04-23 15:18:25 794

原创 Day49|动态规划part10:121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

正统更广泛的解法是动态规划。dp[i][0] 表示第i天持有股票所得最多现金dp[i][1] 表示第i天不持有股票所得最多现金如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来如果第i天不持有股票即dp[i][1], 也可以由两个状态推出来同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所以dp[0][1] = 0;

2024-04-23 10:48:24 280

原创 Day48|动态规划part09:198.打家劫舍、213.打家劫舍II、337.打家劫舍III

两种选择,偷这一家或者不偷:还有这种,看看哪个比较好理解:还有将空间复杂度降到常数级:213.打家劫舍II这题增加的条件就是首尾也是相邻的。也就是说第一间屋子和最后一间是相邻的。因此可能存在三种情况(实际上是两种)也就是把上面的rob函数用两次,找到最大值即可:337.打家劫舍III这题的房子又进阶成二叉树了,没啥思路,直接看题解:这道题目算是树形dp的入门题目,因为是在树上进行状态转移,我们在讲解二叉树的时候说过递归三部曲,这里我们要求一个节点 偷与不偷的两个状态所得到的金钱,那么返回值就是一

2024-04-22 10:44:11 846

原创 Day45|动态规划part07:70. 爬楼梯 (进阶)、322. 零钱兑换、279. 完全平方数

之前已经做过这题了,实际上这题可以抽象成一个(只有两种物品,一个1一个2,但是可以无限取),接下来用动规五部曲重新分析一下。dp[j]表示爬楼梯为j时的爬法。跟之前组合问题总和一样,问的是爬法数量:dp[j] = dp[j - value[i]],其中value={1,2}dp[0] = 1;每一步可以走多次,这是完全背包,内循环需要从前向后遍历。总结:排列先遍历背包,组合先遍历物品。

2024-04-21 21:18:08 282

原创 Day44|动态规划part06:完全背包、518. 零钱兑换II、377. 组合总和IV

有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。,求解将哪些物品装入背包里物品价值总和最大。与0-1背包的区别在于每件物品都有无限个;01背包和完全背包唯一不同就是体现在上。

2024-04-21 20:49:01 224

原创 Day43|动态规划part05: 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

本题物品的重量为stones[i],物品的价值也为stones[i]。对应着里的物品重量weight[i]和 物品价值value[i]。。01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);既然 dp[j]中的j表示容量,那么最大容量(重量)(也就是target)是多少呢,就是所有石头的重量和。定为target15001即可, 也可以将数组相加再/2在。

2024-04-17 11:13:31 957

原创 Day42|动态规划part04: 01背包问题,你该了解这些!、滚动数组、416. 分割等和子集

其他背包,面试几乎不会问,都是竞赛级别的了,leetcode上连多重背包的题目都没有,所以题库也告诉我们,01背包和完全背包就够用了。而完全背包又是也是01背包稍作变化而来,即:完全背包的物品数量是无限的。

2024-04-17 09:47:28 918

原创 Day41|动态规划part03:343. 整数拆分、96. 不同的二叉搜索树

这两题都是dp数组是一维但打表的时候用到了二维,因此时间复杂度是o(n2),外层循环i用来存结果,j用来穷举优化结果。

2024-04-15 09:35:28 150

原创 Day39|动态规划part02:62.不同路径、63. 不同路径II

【代码】Day39|动态规划part02:62.不同路径、63. 不同路径II。

2024-04-13 21:55:11 178

原创 Day38|动态规划part01:理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

注意数组越界问题,特殊情况特殊判断;

2024-04-12 11:26:49 204

原创 Day37|贪心算法part06:738.单调递增的数字、968. 监控二叉树、贪心总结

最近发现总结还有每道题的总结,之后大批量刷的时候根据总结去刷题。

2024-04-12 09:51:36 460

原创 Day36|贪心算法part05:435. 无重叠区间、763.划分字母区间、56. 合并区间

(以上就是不重叠区间的用法,用总区间数 - 不重叠区间数就是要删除的区间树)

2024-04-11 16:14:55 456

原创 Day35|贪心算法part04:860.柠檬水找零、406. 根据身高重建队列、452. 用最小数量的箭引爆气球

这是一个模拟题,但也有贪心思想:5块更通用,所以20的时候优先用10块。

2024-04-09 19:29:28 452

原创 Day34|贪心算法part03:1005.K次取反后最大化的数组和、134. 加油站、135.分发糖果

按照“绝对值”从大到小排序,如果数字小于0将其翻转,最后检查k有没有用完,没用完就反复翻转绝对值最小的数。IntStream.of(nums): 这一步将nums数组转换为一个IntStream流。.boxed(): 这一步将IntStream流转换为Stream流。这是因为IntStream流没有sorted()方法可以接受自定义的比较器,而Stream流可以。

2024-04-08 10:33:49 392

原创 Day32|贪心算法part02:122.买卖股票的最佳时机II、55. 跳跃游戏、45. 跳跃游戏II

我发现贪心很多时候是用来解决“差值”的问题,而且题目并不会要求输出具体路径,而往往是求和或者判断是否符合条件。贪心没有套路,贪心能做的DP一定也能做,反之不一定成立。差值问题注意起始和终止两个点的处理。使用贪心算法的实际应用还挺多,比如赫夫曼编码也是一个经典的贪心算法应用。更多时候运用贪心算法可能不是求最优解,而是求次优解以节约时间,比如经典的旅行商问题。

2024-04-07 20:54:35 471

原创 Day31|贪心算法part01:理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和

记得贪心。

2024-04-05 13:30:24 606

原创 Day30|回溯算法part06:332.重新安排行程、51. N皇后、37. 解数独、总结

回溯法一刷算是基本结束了,总结一下。

2024-04-04 12:06:21 192

原创 Day29|回溯算法part05:491.递增子序列、46.全排列、 47.全排列 II

leetcode上本题叫做非递减子序列,点名序列存在重复元素的情况。

2024-04-03 17:26:12 229

原创 Day28|回溯算法part04:93.复原IP地址、78. 子集、90. 子集II

这就是一个切割问题,跟切割子串类似,但是这题使用.切割。

2024-04-03 13:42:23 284

原创 Day27|回溯算法part03:39. 组合总和、40.组合总和II、131.分割回文串

跟III的区别在于候选元素从原来的数字换成具体的数组了,其他的大概逻辑没有变,还有就是startIndex穿进去的时候不用+1(因为可以重复添加自身)

2024-04-01 09:29:40 441

原创 Day25|回溯算法part02:216.组合总和III、17.电话号码的字母组合

(注意sum+i的位置)

2024-03-30 15:49:00 186

原创 Day24|回溯算法part01:理论基础、77. 组合

回溯算法中函数返回值一般为void。再来看一下参数,因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。

2024-03-29 11:00:04 227

原创 Day25:统一处理异常、AOP编程、统一记录日志

表现层在最外面,异常在这层处理。

2024-03-28 23:11:06 898

原创 Day24:私信列表、私信详情、发送私信

测试用户:用户名aaa 密码aaa。

2024-03-28 21:46:51 603

原创 Day23|二叉树part09:669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、总结篇

二叉树:是否对称(opens new window)递归:后序,比较的是根节点的左子树与右子树是不是相互翻转迭代:使用队列/栈将两个节点顺序放入容器中进行比较二叉树:求最大深度(opens new window)递归:后序,求根节点最大高度就是最大深度,通过递归函数的返回值做计算树的高度迭代:层序遍历二叉树:求最小深度(opens new window)递归:后序,求根节点最小高度就是最小深度,注意最小深度的定义迭代:层序遍历二叉树:求有多少个节点(opens new window)

2024-03-28 14:30:12 557

原创 Day23:事务管理、显示评论、添加评论

什么是事务。

2024-03-27 21:21:44 1167

原创 Day22|二叉树part08:235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

首先这题用普通二叉树的解法也是可以ac的,但忽略了二叉搜索树的性质。

2024-03-27 10:42:23 136

原创 Day21|二叉树part07:530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(这里分两种方法,一种是当作普通的二叉树来做,一种是利用BST的性质来做。

2024-03-26 14:15:14 282

原创 Day20|二叉树part06:654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

因此如果val大于当前节点的值,就去找当前节点的柚子树,注意有找不到的情况,因此需要判断node==val。终于到二叉搜索树了,其性质决定了有很多围绕有序的考题。(二刷还是掉进了这个陷阱!时间复杂度:O(n)空间复杂度:O(n)

2024-03-25 11:27:40 284

原创 Day18|二叉树part05:513.找树左下角的值、112. 路径总和 113.路径总和ii、 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

放*的是重点题目。

2024-03-23 22:42:54 274

原创 Day17|二叉树part04:110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和、543: 二叉树的直径、124: 二叉树的最大路径和

关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。但维基百科上定义用边为一度,即根节点的深度是0,我们暂时以leetcode为准(毕竟要在这上面刷题)。在二叉树中,n个节点的路径长度是n-1(因为路径长度是由边来定义的,而一个路径上的边总是比节点少1)如果我们选择的终止条件是节点是叶子节点,那么在遍历到叶子节点时,我们还会尝试去遍历它的左子节点和右子节点,这将导致我们尝试去访问 null 节点的左右子节点,从而可能出现空指针异常。

2024-03-22 10:26:36 631

原创 Day22:过滤敏感词、开发发布帖子、帖子详情

在utils下创建工具类SensitiveFilter,创建内部类定义前缀树的结构:@Component//是否是敏感词的结尾();//key是下级字符,value是下级节点。

2024-03-21 20:23:42 1083

原创 Day16|二叉树part03:104. 二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

在最坏的情况下,这个完全二叉树可能会变成一条链,也就是说,每个节点都只有一个子节点。在这种情况下,递归的深度(也就是调用栈的大小)将达到O(log n),其中n是树中的节点数。这个算法的时间复杂度是O(log^2 n)。这是因为在每次递归调用中,我们都在检查左子树和右子树的高度,这需要O(log n)的时间。然后,我们可能需要递归地在左子树或右子树中进行相同的操作,这会再次花费O(log n)的时间。因此,总的时间复杂度是O(log n * log n),也就是O(log^2 n)。

2024-03-21 09:35:18 229

原创 Day15|二叉树part02:102. 二叉树的层次遍历等、226. 翻转二叉树、110. 平衡二叉树、101. 对称二叉树

关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。但维基百科上定义用边为一度,即根节点的深度是0,我们暂时以leetcode为准(毕竟要在这上面刷题)。我们可以得到,即使不是完美二叉树也可使用上面的代码,因为在层序遍历中,以我们的上帝视角看,其实结构还是一样的,都处于同一层。跟右视图那题一样,最后一个节点特殊处理,其他的练到poll后队列的头部。只把每一层的最后一个节点加入结果集即可。(高度:从下往上,深度:从上往下)

2024-03-20 16:36:50 1110

原创 Day14|二叉树part01:二叉树基础知识、递归遍历、迭代遍历、统一迭代

跳过,直接掌握上面的三种写法即可。二叉树的java定义:(注意构造函数)

2024-03-19 09:54:12 361

空空如也

空空如也

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

TA关注的人

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