【力扣一刷】代码随想录day49(动态规划part10-12 - 买卖股票专题:121 I、122 II、123 III、188 IV、309 含冷冻期、714 含手续费、买卖股票专题总结) 时间复杂度:O(n²),for循环嵌套遍历 空间复杂度:O(1)时间复杂度:O(n),for循环遍历一次 空间复杂度:O(1)时间复杂度:O(n),for循环遍历一次 空间复杂度:O(n),额外的二维数组时间复杂度:O(n),for循环遍历一次 空间复杂度:O(1),只用了两个变量存储时间复杂度:O(n),for循环遍历一次 空间复杂度:O(1)方法二 动态规划(二维数组)时间复杂度:O(n),for循环遍历一次 空间复杂度:O(
【力扣一刷】代码随想录day48(动态规划part9 - 打家劫舍专题:198.打家劫舍、213.打家劫舍II 、337.打家劫舍III) 当数组中只有两个元素时,不进入for循环,此时y就是答案,所以最后的返回值不能是z,只能是y。
【力扣一刷】代码随想录day44(动态规划part6 - 背包问题专题: 完全背包理论基础、卡码网52、518. 零钱兑换 II、377. 组合总和 Ⅳ ) 遍历第 i 个物品,书包容量为 j 时,不取第 i 个物品,则直接返回旧值dp[ j ],取第 i 个物品时,最大容量为 dp[j - weights[i]] + values[i],其中dp[j - weights[i]]的意思是留足够的空间给需要取的第 i 个物品,再从。完全背包和01背包问题唯一不同的地方就是,01背包问题的每种物品只能取0次或1次,而完全背包问题的每种物品可以取无限次。,外层for遍历的是物品,内层for遍历的是背包容量。2、顺序不同的序列被视作不同的组合,相当于求的是。
【力扣一刷】代码随想录day43(动态规划part5 - 背包问题专题: 1049. 最后一块石头的重量II、494. 目标和、474.一和零) sum = 23,target = 23 / 2 = 11,不可能将这堆石头恰好分成重量相同的两堆,但是最理想的情况下,是容量为11的背包恰好能装满,那么背包里的石头的重量就是11,剩下的没被装入书包的石头的重量就是23-11=12,那么两堆石头的重量差值就是12-11=1,即和为奇数的数组的最小差值至少为1。sum=151,target = 151 / 2 = 75,容量为75的书包最多能装重量为73的石头,那么剩下的石头的重量为151 - 73 = 78,那么最小差值就是 78 - 72 = 5。
【力扣一刷】代码随想录day42(动态规划part4 - 背包问题专题:卡码网46.携带研究材料、416.分割等和子集 ) 1、定义二维矩阵的时候,行数M对应M件物品,列数N+1对应背包容量,因为还需要考虑容量为0的情况。2、初始化第一行时要考虑背包容量和第0件物品所占空间的大小关系,可以直接从物品0所占空间对应的背包容量开始遍历进行初始化,也可以从背包容量0开始遍历加以判断再进行初始化。3、在递推时,也要考虑背包容量和第0件物品所占空间的大小关系,即能不能放物品 i ,不能放直接返回不放的最大价值,能放要考虑不放 i 和放 i 哪个价值大。4、卡码网的输入输出问题,以及记得要import和写main函数。
【力扣一刷】代码随想录day41(动态规划part3:343. 整数拆分、96.不同的二叉搜索树 ) 中等题(需要仔细推理过程)dp(i)就是将 i 拆分为 k 个正整数的和( k >= 2 ),k个整数乘积的最大值。对于 n 而言,需要分 1~n/2 种情况讨论,用 j 代替其中一种那么,j = 1时,剩余的和为n-1,只要比较 1 × dp(n-1) 和 1 × (n-1)哪个更大,即可得到将n拆分为正整数后一定包含正整数1的乘积最大值。以此类推,直至 j = n/2,遍历所有 j 的情况后统计乘积最大值,即可得到dp(n)。
【力扣一刷】代码随想录day39(动态规划part2:62.不同路径、63. 不同路径 II ) 中等题只能向右或向下移动一步,当前格子只能由左边(向右移)或上边(向下移)到达到达当前格子的路径数 = 到达左边格子的路径数 + 到达上边格子的路径数。
【力扣一刷】代码随想录day36(贪心算法part5 - 重叠区间专题:435. 无重叠区间、763.划分字母区间、56. 合并区间 ) 则删除最后一个区间,添加合并后的区间到返回列表中,注意合并区间的右边界应该是两区间右边界的最大值;
【力扣一刷】代码随想录day35(贪心算法part4:860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球 ) 2、调整顺序如果用ArrayList实现,时间复杂度会偏高,最好用LinkedList,而且要想到按k调整顺序相当于按k为索引,依次将people排序后的各个数组插入链表。存在重叠区域:不需要增加箭,只更新shoot的范围,起始位置不变,结束位置取上一个shoot的结束位置和当前遍历气球的结束位置的最小值。按照身高降序排序后,即使将后面的数组调整到前面,也不会影响前面的 k ,因为前面的肯定比后面的高。1、排序需要重写compare方法,先按身高h降序排序,身高相同的情况下,再按k升序排序。
【力扣一刷】代码随想录day34(贪心算法part3:1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果) lambda表达式return的不同类型1、静态方法2、实例方法3、特殊类型方法4、构造器。
【力扣一刷】代码随想录day31(贪心算法part1:理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和 ) 利用摆动标记mark,区分前两种情况,最后一个点一定要记录结果,对应初始值res=1。
【力扣一刷】代码随想录day29(回溯算法part5:491.递增子序列、46.全排列、47.全排列 II) 1、处理当前节点如果到当前节点的路径长度为1或者为0,直接遍历访问子节点即可如果到当前节点的路径长度大于/等于2,则判断是否递增如果递增,则记录路径如果不是递增,则不记录路径,不访问子节点,直接返回在for循环遍历前,定义Set对象,用于记录当前层遍历过的子节点(注意:不能定义为全局变量,因为递归的时候会加入其它层的节点)。在for循环遍历时,如果当前层前面出现过相同值的子节点,就不遍历该子节点,跳过。需要【判断子序列是否递增】和【考虑如何去重】
【力扣一刷】代码随想录day28(回溯算法part4:93.复原IP地址、78.子集、90.子集II ) 去重的时候,是判断当前子节点在当前层前面是否已经遍历过,是 i > start, 而不是 i > 0。i > start才能保证判断的是当前层的第二个节点,而当前层的第一个节点也可能符合 i > 0,万一该节点等于数组中上一个节点的值,则该节点就无法遍历了。只递归遍历单独"0"这个子串的分支,遍历完后直接return,不再遍历剩下的"0x"不合法的IP段。1、将题目抽象成树,子节点为指定开始索引start的子串,在遍历子节点的时候进行剪枝(打叉的地方表示剪枝),保证子节点合法。中等题(偏难,坑很多)