- 博客(47)
- 收藏
- 关注
原创 左值引用&右值引用
左值可以取地址,例如位于等号左边 int a = 6 中的 a例如变量,左值在表达式结束后依然存在右值不能取地址,例如位于等号右边 int a = 6 中的 6例如字面量或临时变量,通常表示一个即将被销毁的值左值引用能指向左值,不能指向右值例如 int &ref_a = a,而不能是 int &ref_a = 6;因为右值没有地址,没办法被修改,而引用是变量的别名,实质上是一个变量,变量是有地址的一个有地址,一个没地址,所以左值引用无法指向右值。
2024-10-15 22:16:18
521
原创 共享指针 shared_ptr
共享所管理的指针的内容的传播和释放,例如解决多线程使用同一个对象时的析构问题使用场景示例:对于同一帧视频数据业务A要将数据保存在本地业务B要将数据上传到云端这时候如果将数据都深拷贝一份再传入各个业务线程,就会带来很大的资源浪费,此时就可以使用共享指针来管理指向这些数据的指针;前提是要管理的这些数据,是只读的,如果要修改内容,就要考虑采用加锁等手段来避免产生数据安全的问题。
2024-10-14 16:49:01
636
原创 C++ const关键字
当成员函数用const修饰之后,相当于const修饰了this指针,那就变成了一个常量指针,不允许修改其指向的值;成员函数中其实隐藏了一个形参this指针,在函数被调用的时候,编译器会把对象的地址作为实参传递给this形参;即用const修饰之后的成员函数,只能访问成员变量,而不能做任何修改;const 在指针左边,左定值,即不能通过指针修改该值。const 在指针右边,右定向,即不能改变指针的指向。this指针本身就是一个指针常量,不允许修改其指向;不能通过引用修改该值。
2024-09-28 22:51:18
307
原创 C++ 排序算法
2. 分区步骤:选取基准点和前后指针后,遍历区间,先从右往左,找到第一个比基准点小的元素, 左指针=右指针的值;然后从左往右,找到第一个比基准点大的元素,右指针=左指针的值,重复直到两指针相遇,相遇点=基准点的值;应用在快排(默认从小到大排序)上,就是取一基准点,遍历数组,将比基准点大的放在基准点右边,比基准点小的放在基准点左边;然后再以同样的思路,在基准点左边序列中,重新取一基准点,重复上述流程,直到只需要比较一个元素和基准点的大小,即为有序。
2024-09-26 13:30:51
385
原创 C++ 单例模式
1. 在多线程情况下,懒汉模式是线程是不安全的,如果多个线程同时去访问单例对象,而这个单例对象尚未初始化,那么在判断 instance == nullptr 的时候,可能会出现 instance 已经在创建了,但是判断结果还是为true,就会创建出多个单例对象的实例;解决方案:使用双检查锁;使用静态局部变量也可以解决;为什么要两次判断 instance == nullptr 之后,才初始化单例对象?
2024-09-21 20:14:35
624
原创 Day.42 | 42.接雨水 84.柱状图中最大的矩形
要点:右边第一个更大的元素,与当前元素,与当前元素的左边栈顶元素,构成一个凹槽,计算凹槽的面积,获得结果。计算结果的时候,当前元素会被pop掉,所以其实是一行一行的计算能接雨水的量。
2024-08-15 08:18:46
296
原创 Day.41 | 739.每日温度 496.下一个更大元素I 503.下一个更大元素II
要点:求当前元素的下一个更大元素,并在结果数组中,当前元素的索引位置,放入与更大元素索引的差值,单调栈的经典题目,要模拟栈中数据弹出和入栈的过程。
2024-08-13 21:13:23
361
原创 Day.39 | 115.不同的子序列 583.两个字符串的删除操作 72.编辑距离
要点:当 s[i - 1] == t[j - 1] 的时候,即 "bagg" 和 "bag" 中,"bag" 和 "ba" 的匹配个数和 "bag" 和 "bag" 的匹配个数相加;当 s[i - 1]!= t[j - 1] 的时候,就是直接取上一位的匹配结果,"bag" 和 "ba",与 "ba" 和 "ba" 的匹配结果是一样的。
2024-08-11 00:02:30
308
原创 Day.38 | 1143.最长公共子序列 1035.不相交的线 53.最大子序和 392.判断子序列
要点:dp[i][j] = dp[i - 1][j - 1] + 1;
2024-08-08 22:57:07
309
原创 Day.37 | 300.最长递增子序列 674.最长连续递增序列 718.最长重复子数组
要点:dp[i] 表示在位置 i 处,最长递增子序列的长度。
2024-08-07 22:57:42
239
原创 Day.36 | 188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费
要点:股票卖麻了。其实就是结合上一个仅能买卖两次的股票题找规律,把递推公式转变成for循环解决问题。
2024-08-06 21:22:34
222
原创 Day.35 | 121.买卖股票的最佳时机 122.买卖股票的最佳时机II 123.买卖股票的最佳时机III
要点:dp[i][0] 是第 i 天持有股票时的资产,dp[i][1] 是第 i 天卖出股票时的资产,只跟前一天有关。
2024-08-01 20:36:23
275
原创 Day.34 | 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
要点:1. 房子形状为数组,dp[i] 偷到第 i 间房子,最多可以偷多少;2. 递推公式,由前两间房子被偷的状态推导出来;3. 初始化,i 与 i-1 i-2 有关,所以初始化 0 1;4. 顺序,i 与 i-1 i-2 有关,所以正序。
2024-07-31 21:47:35
270
原创 Day.33 | 322.零钱兑换 279.完全平方数 139.单词拆分
要点:dp数组 dp[j] 的含义是装 j 金额的背包,最少需要的硬币数。
2024-07-30 21:12:12
259
原创 Day.31 | 1049.最后一块石头的重量II 494.目标和 474.一和零
要点:思路与分割等和子集很类似,把总数分成和最接近的两堆,然后用01背包的套路解答。
2024-07-28 23:09:07
318
原创 Day.29 | 62.不同路径 63.不同路径 II
要点:二维dp数组,初始化第一行第一列都是1,因为只有一种方法可以走到第一行或第一列;除第一行第一列外,其他格子能走到的路径数为其左边格子和上方格子之和;想到这两点,这题就可以解答。
2024-07-26 21:55:58
201
原创 Day.28 | 509.斐波那契数 70.爬楼梯 746.使用最小花费爬楼梯
要点:五部曲公式动规第一题;1.dp数组的意义&数组下标的意义;2.确定递推公式;3.数组初始化;4.确定遍历顺序;5.举例推导dp数组。
2024-07-25 19:12:52
333
原创 Day.27 | 56.合并区间 738.单调递增的数字
要点:找重叠区间。如果区间不重叠,直接push前一元素;如果区间重叠,将当前元素和前一元素合并;如果遍历到最后一个了,直接push。
2024-07-24 22:46:36
281
原创 Day.26 | 452.用最少数量的箭引爆气球 435.无重叠区间 763.划分字母区间
要点:找重叠区间。如果当前元素的左边界大于前一元素的右边界,说明两元素没有重叠,需要一只箭;如果有重叠,则继续看后一元素,后一元素的左边界大于当前元素和前一元素最小的右边界,说明后一元素跟前两个元素没有重叠,需要一只箭引爆前两个元素。
2024-07-23 22:59:59
261
原创 Day.25 | 134.加油站 135.分发糖果 860.柠檬水找零 406.根据身高重建队列
要点:局部最优推全局最优。rest = gas - cost,当天的总rest,是前面每一天rest的累加,如果当天总rest小于0,说明从起点到当天的这个区间内,无论从哪一天开始,都是开不到终点的,只有当天的下一天才有可能到终点。totalSum用于判断是不是真的能到终点。
2024-07-22 22:25:44
249
原创 Day.24 | 122.买卖股票的最佳时机II 55.跳跃游戏 45.跳跃游戏II 1005.K次取反后最大化的数组和
要点:利润和,其实就是每天的利润加起来,要使利润和最大,只需要记录利润为正的时候就行。也就是相邻元素的差为正,就记为正。
2024-07-20 22:12:17
237
原创 Day.23 | 455.分发饼干 376.摆动序列 53.最大子序和
要点:大饼干分给和大饼干最匹配的最大胃口的孩子。所以要定住饼干的索引,挨个问孩子,能不能刚好满足胃口,碰到合适的孩子,就分给他,然后饼干索引移动一位。
2024-07-20 20:33:04
252
原创 Day.21 | 93.复原IP地址 78.子集 90.子集II
要点:判断截取出来的ip数字是否合法;因为要截4个数字出来,所以以加入的 ‘ . ’ 为递归终止条件,有三个点递归就结束。
2024-07-19 19:44:44
224
原创 Day.20 | 39.组合总和 40.组合总和II 131.分割回文串
要点:元素可以重复,那么遍历的startIndex就跟之前的回溯算法不一样了;
2024-07-16 21:35:30
239
原创 Day.18 | 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
要点:递归中还有递归。为什么要再套一层递归,在删除节点后,例如删除比下界小的节点,该节点的左子树肯定全部比下界小,左子树可以全部删除,但是右子树里可能还存在比下界小的节点,所以需要加一层递归去删除。(其实还是有点没梳理清楚)
2024-07-15 13:57:56
246
原创 Day.17 | 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
要点:当节点遍历到p和q中间的时候,就是最近公共祖先。所以当p q都比当前遍历节点小,向左遍历,反之向右遍历,在中间,就是想要的结果。因为二叉搜索树有序的特性,此题相当于找公共祖先的特解。
2024-07-14 22:19:32
281
原创 Day.16 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
要点:把二叉搜索树变成有序数组,因为数组有序,求最小绝对差,只需要求有序数组相邻元素差的最小值就可以了。只要能想出这个思路,这道题就能秒。二叉搜索树的中序遍历结果就是一个有序数组。
2024-07-14 16:31:15
217
原创 Day.15 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
要点:递归,递归到最底层,传进去的nums序列中元素个数为0,递归终止,终止的上一层,必然只有一个节点,这个节点在其上一层节点的左边还是右边,就是左节点或者右节点。其实递归每一层就是确定一个元素,再确定这个元素是左节点还是右节点。
2024-07-13 22:42:26
259
原创 Day.14 | 513.找树左下角的值 112.路径总和 前中后序构造二叉树
要点:理解题意,找左下角的值,就是找最大深度最左边节点的值,显然第一时间就能想到层序遍历,用递归法加深一下对回溯的理解。
2024-07-13 13:17:28
147
原创 Day.13 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数
要点:递归三部曲:1.确定递归函数的参数和返回值 2.确定终止条件 3.确定单次递归的处理逻辑。这一题,单次递归处理就是判断左右子树高度的差值是否小于1。也是一道递归后序遍历求高度的题目。
2024-07-09 23:05:54
258
原创 Day.12 | 226.翻转二叉树 101.对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度
要点:只要能理解到,翻转二叉树,其实就是把二叉树中的所有节点的左右孩子交换,这道题就很简单了。所有对二叉树的遍历方法,即只要能访问二叉树所有节点,访问的同时交换其左右孩子,这样的方法都适用于这道题目。
2024-07-08 19:37:57
138
原创 Day.10 | 150.逆波兰表达式求值 239.滑动窗口最大值 347.前 K 个高频元素
要点:确实是没做过的话很难想到解题思路,理解逆波兰表达式是什么,计算机是如何计算数学表达式的方法:1. 遍历,找+-*/ 四个符号2. 碰到符号,就把栈顶的两个元素弹出计算结果3. 将计算出的结果push入栈。
2024-07-03 19:06:14
332
原创 Day.9 | 232.用栈实现队列 225.用队列实现栈 20.有效的括号 1047.删除字符串中的所有相邻重复项
要点:用栈实现队列,队列是先进先出,要实现取队列头部的元素,就要把栈中的元素一个个拿出来,直到取出第一个,再把取出的元素一个个放回去,所以很容易就可以想到,需要额外的数据结构来保存取出的元素方法:1. 两个数据结构,一个出栈,一个入栈2. 要实现取队列顶端的元素,push的时候,往入栈里push,pop的时候,先从出栈里弹,如果出栈为空,就按照先进后出的原则,把入栈的元素一个个放进出栈,再从出栈里弹。
2024-07-02 17:32:07
195
原创 Day.8 | 151.翻转字符串里的单词 55.右旋转字符串
要点:双指针移除多余的空格,想了很久才想明白方法:1. 移除多余空格1.1 碰到字母,快慢指针一起走1.2 快指针碰到空格,先走,不管慢指针,直到碰到字母再停下1.3 快指针碰到字母停下后,慢指针加入一个空格,前移一位1.4 第一个单词做一下特殊处理2. 去除多余空格后,整个字符串先反转3. 遍历字符串,碰到空格或者直到字符串末尾,将单词原地反转。
2024-07-02 16:15:30
289
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人