- 博客(38)
- 收藏
- 关注
原创 代码随想录Day 34 | LC 1049, 494, 474
二维dp数组历的时候不用倒序: 因为对于二维dp,dp[i][j]都是通过上一层即dp[i - 1][j]计算而来,本层的dp[i][j]并不会被覆盖。倒序遍历的原因是,本质上还是一个对二维数组的遍历,并且右下角的值依赖上一层左上角的值,因此需要保证左边的值仍然是上一层的,从右向左覆盖。假设石头的重量分别为 x 和 y,且 x <= y。= y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。二维dp遍历的时候,背包容量是从小到大,而一维dp遍历的时候,背包是从大到小。
2023-06-14 22:12:40
110
原创 代码随想录Day 33 | LC 416
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200。
2023-06-06 08:26:55
127
原创 代码随想录Day32 | LC 738, 968
动态规划中每一个状态一定是由上一个状态推导出来的,这一点区分于贪心,贪心没有状态推导,而是从局部直接选最优的。:从后往前遍历(重复利用上次比较的结果),找到不是单调递增的下标,减一,剩余数字尽可能的大,改为9。:当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。:局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少。空节点的状态只能是有覆盖,这样就可以在叶子节点的父节点放摄像头。:给定一个二叉树,我们在树的节点上安装摄像头。
2023-06-01 09:09:25
105
原创 代码随想录Day31 | LC 425, 763, 56
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi]。返回 需要移除区间的最小数量,使剩余区间互不重叠。
2023-05-31 20:14:36
97
原创 代码随想录Day30 | LC 860, 406, 452
在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆。:假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。:从高到低的顺序排,插入ki位,因为后插入的数小,不会影响已经插入的数。
2023-05-31 08:42:00
130
原创 代码随想录Day29 | LC 1005, 134, 135
给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。如果存在解,则 保证 它是 唯一 的。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。:局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。:在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目。
2023-05-29 19:19:43
42
原创 代码随想录Day28 | LC 122, 55, 45
每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。:给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。:给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。返回 你能获得的 最大 利润。
2023-05-28 15:29:36
38
原创 代码随想录Day26 | LC 332, 51, 37
空间复杂度:O(n),递归深度为n,所以系统栈所用空间为O(n),每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为O(n)),这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * …时间复杂度:O(2 ^ n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为O(2^n)
2023-05-28 12:11:01
654
原创 代码随想录Day27 | LC 455, 276, 53
例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。每次更新dp[i][0],则在tree1的nums[i]位置值更新为dp[i][0]每次更新dp[i][1],则在tree2的nums[i]位置值更新为dp[i][1]空间复杂度:O(n)
2023-05-27 20:53:25
110
原创 代码随想录Day25 | LC 491, 46, 47
题目:Given an integer array nums, return all the different possible non-decreasing subsequences of the given array with at least two elements. You may return the answer in any order.
2023-05-26 09:11:12
55
原创 代码随想录Day24 | LC 93, 78, 90
题目:Given a string s containing only digits, return all possible valid IP addresses that can be formed by inserting dots into s. You are not allowed to reorder or remove any digits in s. You may return the valid IP addresses in any order.
2023-05-24 20:07:22
299
原创 代码随想录Day23 | LC 39, 40, 131
题目:Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s.思路:和39题的区别是有重复的数字,但是不可以有重复的位置。优化:将所有可能的substring是否为回文串提前算好。同一树层不可以重复,同一树枝可以重复。
2023-05-23 21:20:45
90
原创 代码随想录Day21 | LC 77
因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。for循环可以理解是横向遍历,backtracking(递归)就是纵向遍历。回溯法解决的问题都可以抽象为树形结构。
2023-05-21 23:15:03
96
原创 代码随想录Day20 | LC 669, 108, 538
求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。(前序求深度,方便让父节点指向子节点)思路:题目要求是balanced BST, 如果不是BST, 可以变成只有左子树/右子树。涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。
2023-05-21 22:35:20
104
原创 代码随想录Day19 | LC235, 701, 450
二叉搜索树:从上向下去递归遍历,第一次遇到 cur节点是数值在[p, q]区间中,那么cur就是 p和q的最近公共祖先。二叉树:如果node本身是自己的ancestor,那么只有left/right一边有值,另一边为空值,所以必须搜索整个二叉树。完全二叉树一定是平衡二叉树,堆的排序是父节点大于子节点,而搜索树是父节点大于左孩子,小于右孩子,所以堆不是平衡二叉搜索树。
2023-05-20 20:25:27
44
原创 代码随想录Day18 | LC530, 501, 236
思路:中序遍历,按顺序比较节点大小。用prev和curr比较求最小差值。思路:从底向上遍历,后序遍历。
2023-05-19 09:25:46
34
原创 代码随想录Day17 | LC 654, 617, 700, 98
终止条件:一般情况来说:如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整。空指针进入递归,终止条件为空指针,空指针不进入递归,终止条件为叶子结点。要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了。中序遍历:把二叉树转为有序数组。
2023-05-17 12:33:27
41
原创 代码随想录day15 lc110, 257, 404
如果是模拟前中后序遍历就用栈,如果是适合层序遍历就用队列,当然还是其他情况,那么就是 先用队列试试行不行,不行就用栈。每次都是复制赋值,不用使用引用 (相当于backtrack)求高度(该节点到叶子节点),后序遍历。
2023-05-15 08:54:16
56
原创 代码随想录day14 lc104, 559, 111, 222
二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始)二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)前序求的是深度,后序求的是高度。
2023-05-14 18:03:30
26
原创 代码随想录day13 lc102, 107, 199, 637, 429, 515, 116, 117, 104, 111, 226, 101
从时间复杂度上其实迭代法和递归法差不多(在不考虑函数调用开销和函数调用产生的堆栈开销),但是空间复杂度上,递归开销会大一些,因为递归需要系统堆栈存参数返回值等等。只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点。每次把prev->next设为curr,再resassign curr。中序遍历:有些node会被交换两次(DFS)用迭代的方式的中序不会交换两次。用栈/队列遍历比较(顺序相同)从下往上返回每层的值。反转result数组。
2023-05-13 16:02:02
40
原创 代码随想录day12 lc94, 144, 145
在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树。
2023-05-12 09:16:50
33
原创 代码随想录day11 lc239, 347
C++中deque是stack和queue默认的底层实现容器 (元素并不是严格的连续分布的)栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中是不是连续分布。priority queue自定义排序。
2023-05-11 08:34:22
64
原创 代码随想录day9 lc232, 225
一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序。
2023-05-09 09:22:36
43
原创 代码随想录day8 lc28, 459
KMP: 当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配。前缀表:记录下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。匹配失败后在哪里重新匹配。KMP: 当一个字符串由重复子串组成的,最长相等前后缀不包含的子串就是最小重复子串。28. 找出字符串中第一个匹配项的下标。时间复杂度:O (m + n)
2023-05-08 09:12:22
58
原创 Spring5 AOP, MVC, IOC (pdai)
此时返回A中,A此时能拿到B的对象顺利完成本身的初始化阶段二、三,最终A也完成了初始化,进去了一级缓存singletonObjects中,并且更加幸运的是,因为B拿到了A的对象引用,因此B如今hold住的A对象完成了初始化。Spring默认在目标类实现接口时是通过JDK代理实现的,只有非接口的是通过Cglib代理实现的。处理使用了@Aspect注解的切面类,然后将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor的过程。
2023-05-07 19:09:28
174
原创 代码随想录day7 lc344, 541, 剑指05, 151, 58-II
剑指 Offer 58 - II. 左旋转字符串。剑指 Offer 05. 替换空格。先扩充数组到替换后的大小。反转区间为n到末尾的子串。局部反转 + 整体反转。反转区间为前n的子串。空间复杂度:O(1)
2023-05-07 15:41:59
136
原创 代码随想录day6 lc454, 383, 15, 18
数组:当key的范围已知且范围小, 不分散(比如小写字母)从不同的数组中取值,可以有重复的情况。
2023-05-06 14:09:35
52
原创 代码随想录day5 lc242, 349, 202, 1
unordered_set vs. 数组:直接使用set占用空间比数组大,速度要比数组慢,set把数值映射到key上都要做hash计算。
2023-05-05 09:13:22
67
原创 代码随想录day4 lc24, 19, 02.07, 142
两个链表尾端对齐,然后让curA移动到和curB 末尾对齐的位置,两个链表同时向后移动,找到相同的两个节点。面试题 02.07. Intersection of Two Linked Lists LCCI。
2023-05-04 09:21:43
107
原创 并发编程 1, 2 (lianglianglee)
已经被舍弃的 stop()、suspend() 和 resume(),它们由于有很大的安全风险比如死锁风险而被舍弃,而 volatile 这种方法在某些特殊的情况下,比如线程被长时间阻塞的情况,就无法及时感受中断,所以 volatile 是不够全面的停止线程的方法。如果 sleep、wait 等可以让线程进入阻塞的方法使线程休眠了,而处于休眠中的线程被中断,那么线程是可以感受到中断信号的,并且会抛出一个 InterruptedException 异常,同时清除中断信号,将中断标记位设置成 false。
2023-05-01 21:32:56
281
原创 Spring5 框架, 要点, IOC (pdai)
JDBC/ORM (Object Relational Mapping)/OXM (Object/XML)/JMS (服务消息)/Transaction。@Target(ElementType.TYPE) #接口、类、枚举、注解。@Target(ElementType.FIELD) #字段、枚举的常量。@Target(ElementType.FIELD) #字段、枚举的常量。@Target(ElementType.FIELD) #字段、枚举的常量。: 用户管理Bean转变为框架管理Bean。
2023-05-01 20:49:30
101
1
原创 代码随想录day0
时间复杂度:O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(nlogn)线性对数阶 < O(n^2)平方阶 < O(n^3)立方阶 < O(2^n)指数阶。变被动为主动,博客的重要性。【项目经验】分 「项目描述」「个人工作」「个人收获」这三块来写。
2023-05-01 17:02:00
73
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人