自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 动态规划 | 编辑距离总结

word2[j - 1]) 时取最小的,即:dp[i][j] = min({dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) + 1;举例说明:s: bagg 和 t: bag,s[3] 和 t[2]是相同的,但是字符串s也可以不用s[3]来匹配,即用s[0]s[1]s[2]组成的bag。当s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配,即:dp[i - 1][j]也就是如上四种情况。

2023-12-15 10:55:49 1090

原创 动态规划 | 打家劫舍1、2、3

dp[i] 表示 考虑到下标为 i (包括i)的房子,可以偷到的最大金额。dp[i] 有两个状态,分别是 偷 和 不偷。偷,则需要考虑前 i-2 天的最大金额 + nums[1]。不偷,则考虑 i-1 天的最大金额即可。

2023-12-02 21:38:44 519

原创 动态规划 | 背包问题总结

在讲解背包问题的时候,我们都是按照如下五部来逐步分析,相信大家也体会到,把这五部都搞透了,算是对动规来理解深入了。确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组。

2023-12-01 21:48:47 875

原创 动态规划 | 139. 单词拆分、多重背包

dp[i]:长度为 i 的字符串可以有字典中出现的单词拼接出来。可以转化为01背包:数量为n的物品,代表n个数量为1的物品。dp[0] = true, 因为后续均由dp[0]推出。多重背包,即在物品重量和价值的两个维度上,又多了数量。按照01背包的思路即可解题。

2023-12-01 21:38:28 478

原创 打卡 | 动态规划 - 完全背包、518. 零钱兑换 II、 377. 组合总和 Ⅳ

相对于01背包的区别,物品有无限个,可以无限取。01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。

2023-11-10 21:32:44 69

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

转化成背包问题:石头的重量也是价值,总体重量的一半就是背包的容量。尽量分成重量相等的两堆石头,相撞即得到。

2023-11-05 23:47:15 47

原创 Day 40 | 动态规划:● 343. 整数拆分 ● 96.不同的二叉搜索树

思路:动规五部曲。

2023-11-01 12:51:08 49

原创 Linux | scp 和 使用nohup后台运行scp 复制大文件

参考:https://blog.csdn.net/xianglingchuan/article/details/72872459scp 命令用于 Linux 之间复制文件和目录。scp 与熟悉的 cp 程序非常相似。最显著的区别就是源或者目标路径名要以远端主机的名字,后跟一个冒号字符开头。命令格式:例:用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。命令格式: 例: 有时候需要复制的文件太大,或者数量太多,需要使用nohup命令后台运行 scp不过 直接 使用 无法输入远程主机密码解决步

2023-11-01 10:14:54 2244

原创 Day 39 | 动态规划:● 62.不同路径 ● 63. 不同路径 II

两道题使用动态规划的思路比较简单。

2023-10-31 23:18:58 37

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

动态规划的递推公式来源于上一状态,不能只简单的套公式,改改,需要了解递推公式dp[i]具体表达什么。具体可以分为以下五步:一些情况:递推公式了dp数组要如何初始化! 所以先确定递推公式写动规题目,代码出问题很正常!找问题的最好方式就是把dp数组打印出来,看看究竟是不是按照自己思路推导的!做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。有问题之前,其实可以自己先思考这三个问题:如果这灵魂三问自己都做到了,基本上这道题目也就解决了,或者更清晰的知道自

2023-10-30 12:11:34 87

原创 Day 35、36 | 贪心,

Day 35。

2023-10-29 23:46:35 26

原创 Day 31、32、33、34 | 贪心

Day 31。

2023-10-29 00:51:01 31

原创 Day 29 | 回溯:组合、排序、去重逻辑

去重:所谓去重,其实就是使用过的元素不能重复选取。组合问题可以抽象为树形结构,那么“使用过”在树形结构上有两个维度,一个维度是同一个树枝上使用过,一个维度是同一个数层上使用过。树层去重:如何判断同一树层上元素(相同的元素)是否使用过了呢?如果并且,就说明:前一个树枝,使用了candidates[i - 1],也就是说同一树层使用过candidates[i - 1]。此时for循环里就应该做continue的操作。

2023-10-21 15:21:13 77

原创 Day 25 | Leetcode 216.组合总和III、17.电话号码的字母组合

思路:跟组合思路很小,不同是加一个 限定条件 和为 n,其余回溯逻辑和组合相同,只不过参数需要加入一个 sum 记录path数组和。

2023-10-17 15:52:11 86

原创 Day 24 | 回溯算法-理论基础、77. 组合

参数的话,因为回溯算法需要的参数不想二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。什么时候到达了终止条件,树中可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。回溯法的性能如何呢,这里要和大家说清楚了,虽然回溯法很难,很不好理解,但是回溯法并不是什么高效的算法。,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。,是的,所有回溯法的问题都可以抽象为树形结构!

2023-10-16 11:51:50 40

原创 Day 23 | 二叉树总结

涉及二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,二叉树:找所有路径 (opens new window)也用了前序,这是为了方便让父节点指向子节点。所以求普通二叉树的属性还是要具体问题具体分析。

2023-10-15 22:08:40 61

原创 Day 22 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

思路:递归法,确定终止条件:遇到空节点就返回。确定递归逻辑:如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。

2023-10-14 23:44:11 75

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

如果不是二叉搜索树的话,使用后序遍历回溯。二叉搜索树的话,如果 p 和 q 的值的大小刚好在 root的两边, (p < root < q or q < root < q),则 root 为p,q的最近公共祖先。

2023-10-14 01:18:33 31

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

利用二叉搜索树中序遍历有序的特点。使用一个前置指针指向前一个节点。跳出条件和递归逻辑。

2023-10-12 16:29:32 34

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

构建二叉树,使用前序遍历。每次需要寻找数组的最大值,根据最大值的位置,将数组分割成左数组和右数组,最大位置为树的根节点。如此递归构建树。

2023-10-12 12:28:27 39

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

注意:是找最后一层的第一个节点。最后一层,即求深度最大的叶子节点。中序后序遍历均可,本题没有处理中间节点,保证优先处理左边节点即可,即左右就行。

2023-10-11 00:52:31 78

原创 Day 17 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

本题返回 布尔类型, 可以使用数值 指代 子树节点是否为平衡二叉树。因为要计算高度使用后序遍历,计算深度使用前序遍历。平衡二叉树,需要判断每个节点的高度差不超过 1。跳出条件:遇到叶子节点时,记录路径,并回溯。记录左子树和右子树的左叶之和,递归遍历。回溯(本质就是递归)

2023-10-09 23:51:14 34

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

对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。

2023-10-08 00:16:01 40 1

原创 Day 14 | 层序遍历、226.翻转二叉树、101.对称二叉树

理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。,出队 len 个元素,即该层元素遍历完毕,遍历过程中将下一层节点全部入队。首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!比较的是两个子树的里侧和外侧的元素是否相等。采用的递归的思路,依次翻转每个节点的左右孩子。翻转二叉树,即需要交换每个节点的左右孩子。遍历树,将一层节点全部入队后,对于二叉树是否对称,

2023-10-06 17:19:58 147 1

原创 day 13 | 二叉树专题:理论基础、递归遍历、迭代遍历、统一迭代

int val;

2023-10-05 23:14:07 205

原创 day 12 | 239. 滑动窗口最大值 、347.前 K 个高频元素

我们用栈实现队列,用队列实现栈来掌握的栈与队列的基本操作。接着,通过括号匹配问题、字符串去重问题、逆波兰表达式问题来系统讲解了栈在系统中的应用,以及使用技巧。通过求滑动窗口最大值,以及前K个高频元素介绍了两种队列:单调队列和优先级队列,这是特殊场景解决问题的利器,是一定要掌握的。注意滑动窗口左边界的去除元素操作。以及单调队列和优先级队列的使用,结合具体场景解决问题。

2023-10-04 16:11:06 39 1

原创 day11 | 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

三道题目都是使用栈解决的经典题目,难度都不大。我觉得最主要就是如何把思路用代码实现,写出相应的代码。比如,当遇到左括号时直接压入一个对应的右括号,这样在遇到右括号时,直接比对栈顶元素即可。这样实现代码非常简洁。再比如,直接使用一个字符串str作为栈,代码实现同样非常简洁。这样的思路可能做的多了自然就会想到。

2023-10-03 17:26:11 82

原创 day 10 | 232.用栈实现队列、225. 用队列实现栈

思路:栈的特点是 先进后出,而队列的特点是 先进先出。使用两个栈,由于栈入栈顺序与队列的出队顺序是 相反的.所以,栈1负责入队,出队时将栈1的元素全部入栈到 栈2。此时,栈2的出栈顺序就是 队列的 出队的顺序。

2023-10-02 15:21:41 47 1

原创 day 9 | KMP算法

next数组就是一个前缀表(prefix table)前缀表有什么作用呢?前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。首先要知道前缀表的任务是当前位置匹配失败,找到之前已经匹配上的位置,再重新匹配,此也意味着在某个字符失配时,前缀表会告诉你下一步匹配中,模式串应该跳到哪个位置。记录下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。

2023-09-29 01:30:38 191

原创 day 7 | 344.反转字符串、 541. 反转字符串II 、 剑指Offer 05.替换空格 、 151.翻转字符串里的单词 、 剑指Offer58-II.左旋转字符串

java中 对字符串操作有点局限,增删操作有时需要转换成StringBuilderpython因为对字符串有切片的操作,所以处理比较方便。

2023-09-28 23:42:33 35 1

原创 day6 | 454.四数相加II 、383. 赎金信 、15. 三数之和 、18. 四数之和 、总结

四数之和返回元组的数量,可以使用map记录count但是四数之和|| 和 三数之和 返回的是元组 (i, j, k, l),需要记录索引,所以使用双指针法更适合。

2023-09-28 20:52:00 57 1

原创 day 5 | 242.有效的字母异位词、349. 两个数组的交集 、202. 快乐数 、1. 两数之和

快乐数」 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。遍历判断 是否存在 k = target - nums[i], 存在返回 [map.get(target - nums[i]), i ];如果是快乐数:那么 1 的平方一直是 1,set中不能存在相同元素,此时判定 n == 1,判断是否为快乐数。使用 set 数组存入数组 每位的平方和,如果不是快乐数时,一定存在相同的 每位平方和。由于 0 <= nums1[i], nums2[i] <= 1000,所以使用数组。

2023-09-28 20:37:51 32 1

原创 Day4 | LeetCode 24. 两两交换链表中的节点、19. 删除链表的倒数第 N 个结点面试题、 02.07. 链表相交、142. 环形链表 II、链表的难点及总结

对节点的操作和判断是一个难点,做之前一定考虑清楚,否则很容易犯错。可以先把步骤写出来,严格按照步骤写代码不容易写迷糊。

2023-09-24 00:36:39 189 1

原创 Day3 | LeetCode 203. 移除链表元素、707. 设计链表、206. 反转链表

【代码】Day3 | LeetCode 203. 移除链表元素、707. 设计链表、206. 反转链表。

2023-09-23 00:06:42 131 1

原创 Day2 | 977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

滑动窗口,遍历右边界,循环更新左边界。模拟,注意边界处理。

2023-09-22 00:43:20 138 1

原创 代码随想录算法训练营第一天 | leetcode 704. 二分查找、27. 移除元素

区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。重新在读这句话,有点理解了。二分查找,真是一写就废。关键在于真要理解代码逻辑是如何写的。

2023-09-20 19:51:43 279 1

原创 【无标题】

/ 创建运算符栈和操作数栈。

2023-06-11 10:35:18 58

原创 第三题gpt

【代码】第三题gpt。

2023-06-11 10:34:43 55

原创 Java线程之间如何通信

可以通过Lock对象的newCondition()方法获取一个Condition实例,然后线程可以调用await()方法进入等待状态,直到其他线程调用signal()或signalAll()方法来唤醒它们。:Java提供了Object类的wait()、notify()和notifyAll()方法来实现线程之间的等待和通知。线程可以调用wait()方法进入等待状态,直到其他线程调用notify()或notifyAll()方法唤醒它。这些方法提供了不同的线程通信机制,具体使用哪种方式取决于你的需求和场景。

2023-06-03 14:23:38 944

原创 在多线程场景下递增数字num,每次调用一次递增一次

本文总结了在多线程场景下递增数字num,每次调用一次递增一次不同的实现方案。使用悲观锁和乐观锁两种方案,代码使用Java实现。记录以用于线程和多并发知识的学习。实际测试,三种方法性能都差不多。就是三种不同的写法。CAS思想,在Java并发思想中很重要。

2023-06-03 13:28:56 707

空空如也

空空如也

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

TA关注的人

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