- 博客(53)
- 收藏
- 关注
原创 代码随想录打卡总结篇
我系统的学完了数组、链表、哈希表、字符串、双指针法、栈与队列、二叉树、回溯算法、贪心算法、动态规划、单调栈这十一个板块,觉得力扣上的题也没有想象中的那么困难了,算是给我增强 了信心吧!因为氛围对我来说还是蛮重要的,每天自己会坚持打卡,如果自己一个人慢慢学,我现在大概率就是还没学完的状态,至少自己现在已经过了一遍了。虽然自己对于前面的内容肯定好多题都忘记了,但是在过了一遍思路之后,我感觉后面捡起来也更容易一些。坚持了两个月,11个模块的内容终于学完啦,学完之后感觉训练营还是蛮值的!
2023-04-18 20:56:48 543
原创 代码随想录打卡第60天|84.柱状图中最大的矩形(本轮打卡圆满结束啦~)
st.isEmpty() && heights_new[i] < heights_new[st.peek()]代表heights_new[i]小于栈里的值对应数组数值的情况,那此刻则找到了小于栈顶数字位置对应数值的元素为 heights_new[i] ,对应的位置为i,情况2:heights_new[i] == heights_new[st.peek()]代表:heights_new[i]等于栈里的值对应数组数值的情况,那此刻将栈内元素弹出,再将i压入栈中 st.pop();st.push(i);
2023-04-15 20:48:30 565
原创 代码随想录打卡第59天|503.下一个更大元素II;42. 接雨水
st.isEmpty() && nums[i%size] > nums[st.peek()]代表现在nums数组的元素值 > nums[栈顶数字]的元素值,那此刻则找到了大于栈顶数字位置对应数值的元素为 nums[i] ,对应的位置为i,st.isEmpty() && height[i] > height[st.peek()]代表height[i]大于栈里的值对应数组数值的情况,那此刻则找到了大于栈顶数字位置对应数值的元素为 height[i] ,对应的位置为i,3-3:再判断栈是否为空if(!
2023-04-14 16:50:58 492
原创 代码随想录打卡第58天|739. 每日温度;496.下一个更大元素 I
st.isEmpty()&& nums2[i] > nums2[st.peek()] 代表现在nums2数组的元素值 > nums2[栈顶数字]的元素值,那此刻则找到了大于栈顶数字位置对应数值nums2[st.peek()]的元素为 temperatures[i] ,对应的位置为i(注:用while的原因是判断是一个持续的过程)代表现在temperatures数组的元素值 <= temperatures[数组栈顶数字]的元素值,那此刻将i再压入栈中st.push(i);结果记录后弹出栈内比i小的那个数。
2023-04-13 15:20:30 440
原创 代码随想录打卡第57天|647. 回文子串;516.最长回文子序列
j从i+1开始,因为j>=i,j=i的情况已经初始化了,所以j >i。j=i代表一个字母,是回文子串,j-i=1代表i,j相邻且相等,是回文子串,所以返回true。dp[i][j]:s字符串下标i到下标j的子串是否是一个回文串,即s[i, j]dp[i][j]:从下标i到下标j的子串的最长回文子序列的长度。由于dp[i][j] = dp[i+1][j-1];由于dp[i][j] = dp[i+1][j-1];情况1:dp[i][j-1],j往里走一个。
2023-04-12 20:23:06 571
原创 代码随想录打卡第56天|583. 两个字符串的删除操作;72. 编辑距离
由于不需要进行删除操作,所以不需要加1。dp[i][0] = dp[i-1][-1]:表示单词1不是空,单词2是空的情况下,单词1要与单词2相同所需的最小删除步数,所以初始化为i。dp[0][j] = dp[-1][j-1]:表示单词1是空,单词2不是空的情况下,单词2要与单词1相同所需的最小删除步数,所以初始化为j。dp[i][0] = dp[i-1][-1]:表示单词1不是空,单词2是空的情况下,单词1要与单词2相同所需的最小删除步数,所以初始化为i。
2023-04-11 17:47:05 670
原创 代码随想录打卡第55天|392.判断子序列;115.不同的子序列
每个dp[i][j]元素都初始化为0,因为dp[0][j] =dp[-1][j-1]+1;dp[i][0] = dp[i-1][-1]:表示长字符串不是空,短字符串是空的情况下,长字符串中短字符串出现的次数,所以初始化为1,长字符串将元素全部删除就是空串了。if(nums1[i-1] == nums2[j-1]),则i和j同时移动,所以为i-1,j-1;情况1:使用i-1与j-1相等,则i-2与j-2相等的次数就是i-1与j-1相等的次数,不加1 的原因是这里是出现的次数,而不是求公共长度;
2023-04-10 16:38:48 407
原创 代码随想录打卡第53天|1143.最长公共子序列;1035.不相交的线;53. 最大子序和(动态规划版)
每个dp[i][j]元素都初始化为0,因为dp[0][j] =dp[-1][j-1]+1;都出现了无意义的dp[-1],所以dp[0][j] 和 dp[i][0] 都初始化为0 ,而其它元素也可初始化为0,所以整个数组初始化为0;如果不相等,则存在两种情况-> dp[i][j] = Math.max(dp[i][j-1],dp[i-1][j]);dp[0]就是nums[0]的值,其它元素都初始化为0;
2023-04-08 20:31:41 507
原创 代码随想录打卡第52天|300.最长递增子序列;674. 最长连续递增序列;718. 最长重复子数组
每个dp[i][j]元素都初始化为0,因为dp[0][j] =dp[-1][j-1]+1;因为必须是连续的,所以只用比较前后两个元素就可以了,不用像上一题写一个for j的循环,遍历小于i的每个元素 nums[j]与nums[i]的关系:dp[i] = dp[i - 1]+1;每个j都可以推出一个dp[i],所以求dp[i]与dp[j]+1的最大值:dp[i] = Math.max(dp[j]+1,dp[i]);300.最长递增子序列。
2023-04-07 21:03:51 560
原创 代码随想录打卡第51天|309.最佳买卖股票时机含冷冻期;714.买卖股票的最佳时机含手续费
关键点1:dp数组的含义1-1:dp[i][0] 第i天持有股票的最大金钱1-2:dp[i][1] 第i天卖出股票的最大金钱1-3:dp[i][2] 第i天处于冷冻期的最大金钱1-4:dp[i][3] 第i天保持卖出股票的最大金钱 关键点2:递归公式的推导2-1:dp[i][0] = Math.max(dp[i-1][0],Math.max(dp[i-1][3]-prices[i],dp[i-1][2] - prices[i])); 第i天持有股票的最大金钱 = max( 第i-1天持有股票的最大金
2023-04-06 19:53:04 397
原创 代码随想录打卡第49天|121. 买卖股票的最佳时机;122.买卖股票的最佳时机II
2-2:第i天持有股票的最大金钱 = max(第i-1天持有股票的最大金钱,第i-1天不持有股票的最大金钱 - 第i天买入股票的最大金钱) dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);由于下一个dp值与上一个dp值有关,因此for循环从前往后遍历(0已经初始化了,从1开始遍历)1-2:dp[i][1] 第i天持有股票的最大金钱。1-2:dp[i][1] 第i天持有股票的最大金钱。122.买卖股票的最佳时机II。
2023-04-04 21:29:16 112
原创 代码随想录打卡第48天|198.打家劫舍;213.打家劫舍II;337.打家劫舍III
关键点2:dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1])、dp[i-2]+nums[i]是取了的情况,dp[i-1]是没取的情况,求最大值。关键点1:if(nums.length == 1) return nums[0];
2023-04-03 22:50:57 156
原创 代码随想录打卡第46天|139.单词拆分
word.equals(s.substring(i - len, i)) 表示字典里的这个单词和字符串对应的i - len, i的字符相等。关键点1:dp数组的含义:dp[s.length()] 表示背包容量为s.length时,是否可以组成字符串;关键点2:遍历顺序:先遍历背包容量,再遍历物品,因为要重复使用元素,所以背包要正序遍历。dp[i - len] dp数组前i-len个都是true;关键点4:递归公式,dp[i] = true;关键点5:最终,返回 dp[s.length()]
2023-04-01 22:12:29 151
原创 代码随想录打卡第45天|70. 爬楼梯(进阶);322. 零钱兑换;279.完全平方数
关键点4:递归公式,进入递归公式的条件,只有dp[j-coins[i]]不是初始最大值时,该位才有选择的必要 if (dp[j - coins[i]]!关键点3:dp[] 数组初始化,dp[0]=0,因为要求完全平方数的最少数量,所以dp数组的其它非0元素需要初始化为一个最大值,避免数值太小,在min计算中,覆盖了真实值。关键点3:dp[] 数组初始化,dp[0]=0,因为要求所需的最少硬币个数,所以dp数组的其它非0元素需要初始化为一个最大值,避免数值太小,在min计算中,覆盖了真实值。
2023-03-31 23:28:37 50
原创 代码随想录打卡第44天|518. 零钱兑换 II ;377. 组合总和 Ⅳ
关键点5:注意与零钱兑换 II 的区别在于,这个先遍历背包,再遍历物品,因为这样会出现1,2;关键点1:dp数组的含义:dp[j]表示背包容量为j时,有dp[j]种实现的方式;关键点1:dp数组的含义:dp[j]表示背包容量为j时,有dp[j]种实现的方式;关键点2:遍历顺序:先遍历物品,再遍历背包容量,因为要重复使用元素,所以背包要正序遍历。关键点2:遍历顺序:先遍历背包容量,再遍历物品,因为要重复使用元素,所以背包正序遍历。关键点4:递归公式,dp[j] += dp[j-nums[i]];
2023-03-30 22:03:30 111
原创 代码随想录打卡第43天|1049. 最后一块石头的重量 II ;494. 目标和;474.一和零
dp[0] = 1;关键点7:递归公式,dp[i][j] = Math.max(dp[i][j],dp[i-x][j-y]+1);关键点3:dp数组:dp[i][j]示背包的两类容量分别为i,j时,装满m个0 和 n个1的最大背包dp[i][j];474.一和零 :dp[i][j]表示0的容量为i,1的容量为j时,装满m个0 和 n个1的最大背包dp[i][j]关键点3:dp数组:dp[j]表示背包容量为j时,有dp[j]种实现的方式;关键点6:递归公式,dp[j] += dp[j-nums[i]];
2023-03-29 22:12:34 97
原创 代码随想录打卡第42天|01背包问题,滚动数组;416. 分割等和子集
因为dp[其它非0元素]要为一个较小值,后续才能在max中比较得到真实值,否则会覆盖真实值,所以dp[其它非0元素] = 0;关键点6:递归公式,因为本题按题意可理解为重量和价值相等,所以weight[i] = nums[i];关键点1:数组为空时,false,数组总和%2 不等于0,false。关键点3:dp数组:dp[j]表示背包容量为j时,能获得的最大价值;关键点1:dp数组:dp[j]表示背包容量为j时,能获得的最大价值。关键点2:遍历顺序:先遍历物品,再遍历背包容量。416. 分割等和子集。
2023-03-28 22:47:23 117
原创 代码随想录打卡第41天|343. 整数拆分;96.不同的二叉搜索树
关键点2:dp[i] 为j从1-i之间循环,左边的节点数的二叉搜索树的种类*右边的节点数的二叉搜索树的种类的循环求和。关键点1:dp数组中dp[i]代表i个节点有多少种二叉搜索树;初始化,0个节点的二叉搜索树是1;关键点2:求这三种情况的最大值:拆分成两个数相乘,拆分成多个数相乘,以及原始的dp[i];关键点1:优化点:因为两个数相近相乘的结果比较大,所以j只到i/2就行了,不用到i;96.不同的二叉搜索树。
2023-03-27 22:37:30 90
原创 代码随想录打卡第39天|62.不同路径;63. 不同路径 II
关键点3:递归公式,两层for循环,同时需保证obstacleGrid[i][j] ==0,左边和上边的路径相加才是path[i][j] 位置的路径和:path[i][j] = path[i][j-1] + path[i-1][j];最后返回path[m-1][n-1];关键点3:递归公式,两层for循环,从左边和上边的路径相加就是path[i][j] 位置的路径和:path[i][j] = path[i][j-1] + path[i-1][j];关键点1:path[i][j]代表第i行和第j列的路径数。
2023-03-25 20:50:42 91
原创 代码随想录打卡第38天|509. 斐波那契数;70. 爬楼梯;746. 使用最小花费爬楼梯
关键点1:因为要得到L[cost.length]:cost.length是下标,所以初始化new int[cost.length+1]:cost.length+1是长度;由于从1和2开始,将L[0]设置为1是为了得到L[2]=L[0]+L[1]=2;关键点1:因为要得到F[n]:n是下标,所以初始化new int[n+1]:n+1是长度,关键点1:因为要得到L[n]:n是下标,所以初始化new int[n+1]:n+1是长度,关键点3:公式 -> 第i个数 = 第i-1个数 + 第i-2个数。
2023-03-24 22:24:36 57
原创 代码随想录打卡第37天|738.单调递增的数字;968.监控二叉树
关键点2:从后往前遍历,如果前一个数大于后一个数,那前一个数减减,记住后一个数的位置为flag,最后将flag到数组末尾都变成‘9’关键点3:主函数判断,if(minCame(root)==0),res++,最后返回res。关键点2:判断左右子节点的状态,依据左右子节点的状态反推上一级节点的状态。关键点1:int转成String,String转成char[]2-2:只要有一个是无覆盖,根则为摄像头。2-3:只要有一个是有摄像头,根则有覆盖。2-1:两个子节点都有覆盖,根则无覆盖。738.单调递增的数字。
2023-03-23 22:07:08 70
原创 代码随想录打卡第36天|435. 无重叠区间;763.划分字母区间;56. 合并区间
3-1:第i个区间的左区间 < 结果集最后一个区间的右区间(重叠时),更新res.getLast()[1],移除结果集的最后一个数组,并将新的start和end加入结果集。关键点4:return res.toArray(new int[res.size()][]);关键点3:遍历字符数组,不断更新end,如果i == end;res加入此时的区间长度,更新区间的起始位置为i+1。关键点2:找到重叠的区间数,就知道需要删掉多少个区间就可以实现无重叠区间了。关键点2:初始化每个区间的起始和终止位置为0;
2023-03-22 22:21:36 51
原创 代码随想录打卡第35天|860.柠檬水找零;406.根据身高重建队列;452. 用最少数量的箭引爆气球
2-2:若第i个气球的左边界 <= 第i-1个气球的右边界;则更新第i个气球的右边界:第i个气球右边界与第i-1个气球右边界的最小值。关键点4:收到 20的情况 ,分为三种:有一张5和一张10,有3张5,或者是都没有。2-1:第i个气球的左边界 > 第i-1个气球的右边界,则count++;关键点2: 利用第i-1个气球右边界与第i个气球的左边界进行对比;关键点1:要先确定:身高从大到小排(身高相同,k小的放前面)关键点2:按照次数,再调整位置:将p插入在p[1]的位置。关键点2:收到 5 的情况。
2023-03-21 22:37:17 128
原创 代码随想录打卡第34天|1005.K次取反后最大化的数组和;134. 加油站;135. 分发糖果
关键点2:如果第i个站点的剩余油量和为负数,证明前面的i个位置都不满足条件,startIndex位置移至i+1,并将剩余油量的和置为0;关键点3:如果全部的负数都转为正数了,但是k还是没有花费完,如果剩余的k为奇数,那就将最小的那个数转为负数,否则不用做操作;关键点4:判断整个数组的剩余油量和,是否<0,如果小于0,返回-1;关键点2:从左到右进行遍历分数数组,右边比左边大,右边的糖果数 = 左边的糖果数 + 1;关键点3:从右到左进行遍历分数数组,左边比右边大,左边的糖果数 = 右边的糖果数 + 1;
2023-03-21 17:29:46 137
原创 代码随想录打卡第32天|122.买卖股票的最佳时机II ;55. 跳跃游戏;45.跳跃游戏II
关键点1:for循环i,在cover的覆盖范围,并且cover 还未到终点时,更新cover的最大覆盖范围;关键点2:如果此时i== cover 证明到了最大覆盖范围,但是还未到终点,count++,并更新cover的最大覆盖范围;关键点:想到:在cover的覆盖范围内,不断更新cover的最大覆盖范围,如果最大的覆盖到了终点,就返回TRUE;关键点3:最后到了终点,就不会进入for循环了,返回记录的count就行。关键点:想到后一天要是比前一天大,就可以前一天买进,第二天卖出。
2023-03-18 17:05:34 94
原创 代码随想录打卡第31天|455.分发饼干; 376. 摆动序列;53. 最大子序和
关键点2:for循环数组,然后sum += nums[i];如果sum > res,就更新res;放入出现摆动的地方,再将preDiff进行变化,这样就可以解决单调性平坡的问题。关键点2:循环的是胃口,因为如果最后一个饼干不满足最后一个胃口,饼干一直往前减小,不会有满足最大胃口的时候,就返回0了。预设第一个平坡,最后那个预设为1,所以res=1;关键点3:里面的判断条件是if,如果满足就j--,res++;关键点1:先对 nums.length<=1的情况进行讨论。关键点1:先对饼干和胃口数组进行排序。
2023-03-17 22:58:12 77
原创 代码随想录打卡第30天|51. N皇后;37. 解数独
2-2:需要有一个判断放的位置是否合法的函数,调用函数,如果合法,则chessBoard[row][col] = 'Q';1-4:循环内部需要判断:这个board[i][j]位置放k是否合适,写一个判断k是否合适的函数;如果合适,就把k值给这个位置,递归,进入下一个位置的判断,再将这个位置的值改为'.'1-3:用for循环将k='1'遍历到k='9',判断是否满足条件,不满足则循环结束返回false;1-2:用if(board[i][j] == '.')判断这个位置放k是否合适;2-3:九宫格是否重复。
2023-03-16 22:47:58 144
原创 代码随想录打卡第29天|491.递增子序列;46.全排列;47.全排列 II
关键点3:与全排列问题的区别在于,它有重复元素,需要用树层去重,用 i>0 && nums[i] == nums[i - 1] && used[i-1] == 0 进行树层去重。关键点2:单层循环条件可以从0开始,因为排列问题,1,2和2,1是两个排列,之前使用过的元素不再使用,用used来排除;关键点2:单层循环条件可以从0开始,因为排列问题,1,2和2,1是两个排列,之前使用过的元素不再使用,用used来排除;关键点3:used[i] = 1,添加,递归,used[i] = 0,弹出。
2023-03-15 22:07:31 150
原创 代码随想录打卡第28天|93.复原IP地址;78.子集;90.子集II
if(s.charAt(i) > '9' || s.charAt(i)< '0')为假。关键点1:结束条件,IP地址是三个点,当点有3个时终止,不过需要判断最后一个子串是否合法,如果合法,就将s放入结果集;关键点4:单层循环条件还是一样的,加入,used[i] = 1,递归,弹出,used[i] = 0。关键点3:子集相比之前的组合,需要将每次递归的结果都放入res集,组合是只放叶子节点的值就好;关键点2:子集相比之前的组合,需要将每次递归的结果都放入res集,组合是只放叶子节点的值就好。
2023-03-14 22:21:44 136
转载 代码随想录打卡第27天|39. 组合总和;40.组合总和II;131.分割回文串
关键点3:单层循环条件里去判断是否是回文串,是回文串才放入path里,不是则i跳下一个,递归调用,回溯。关键点1:主函数排序,新建used,用来判断是否回溯到层级了,调用backTracking,返回结果。关键点3:要进行层级去重,添加到path,求和,used[i]标记为1,递归调用,回溯。关键点4:判断是否是回文串,两个指针往中间走,判断两个指针的值是否相等。关键点1:主函数排序,调用backTracking,返回结果。关键点3:添加到path,求和,递归调用,回溯。关键点2:两个结束条件。
2023-03-13 22:13:54 113
原创 代码随想录打卡第25天|216.组合总和III;17.电话号码的字母组合
关键点3:单层递归的逻辑:str 表示当前index对应的字符串,对str 字符串进行循环,temp.append(str.chartAt(i));关键点3:单层递归的逻辑:对1-9进行循环(此处的9可以剪枝),sum+= i;关键点2:终止条件:如果path.size() == k,sum == n,此时将ArrayList path加入result中,然后return;关键点2:终止条件:如果index == 数字集合的长度,也就是到达最后一个的后一个时,将结果加入list中,然后return;
2023-03-11 21:46:17 130
原创 代码随想录打卡第23天|669. 修剪二叉搜索树;108.将有序数组转换为二叉搜索树;538.把二叉搜索树转换为累加树
关键点2:终止条件,如果left > right(因为区间用的是左闭右闭),所以当只有一个节点时left == rioght,也需构造树,进行处理,所以left =right 时不能终止;情况1:root.val < low,root的右子树可能有满足条件的,接着就往root.right递归;情况2:root.val > high,root的左子树可能有满足条件的,接着就往root.left递归;关键点1:确定参数和返回值,传入参数需包括,数组和构造树的左右区间,返回值,需返回构造的树;
2023-03-09 20:14:48 29
原创 代码随想录打卡第22天|235. 二叉搜索树的最近公共祖先;701.二叉搜索树中的插入操作;450.删除二叉搜索树中的节点
235. 二叉搜索树的最近公共祖先;701.二叉搜索树中的插入操作;450.删除二叉搜索树中的节点
2023-03-09 10:17:18 72
原创 代码随想录打卡第21天|530.二叉搜索树的最小绝对差;501.二叉搜索树中的众数;236. 二叉树的最近公共祖先
530.二叉搜索树的最小绝对差;501.二叉搜索树中的众数;236. 二叉树的最近公共祖先
2023-03-07 21:59:56 50
原创 代码随想录打卡第20天|654.最大二叉树;617.合并二叉树;700.二叉搜索树中的搜索;98. 验证二叉搜索树
654.最大二叉树;617.合并二叉树;700.二叉搜索树中的搜索;98. 验证二叉搜索树
2023-03-06 20:58:46 95
原创 代码随想录打卡第18天|513.找树左下角的值;112. 路径总和;113.路径总和ii;106.从中序与后序遍历序列构造二叉树;105.从前序与中序遍历序列构造二叉树
513.找树左下角的值;112. 路径总和;113.路径总和ii;106.从中序与后序遍历序列构造二叉树;105.从前序与中序遍历序列构造二叉树
2023-03-05 17:25:13 86
转载 代码随想录打卡第17天|110.平衡二叉树;257. 二叉树的所有路径;404.左叶子之和
110.平衡二叉树;257. 二叉树的所有路径;404.左叶子之和
2023-03-03 22:18:20 62
原创 代码随想录打卡第16天|104.二叉树的最大深度;559.n叉树的最大深度;111.二叉树的最小深度;222.完全二叉树的节点个数
104.二叉树的最大深度;559.n叉树的最大深度;111.二叉树的最小深度;222.完全二叉树的节点个数
2023-03-02 22:17:42 84
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人