代码随想录总结 而对于难题,我会尝试着画图,将复杂的问题拆解,一步步推导。6: 经过这两个月的坚持,我已经掌握了数组、字符串、队列、链表、栈、二叉树、回溯、贪心和动态规划等内容。除此之外,他还经常鼓励我们刷蓝桥杯的题目,这表现出了他对我们学习的关心与支持。1: 刚开始学习数据结构时,我发现涉及树和图等内容的学习有些吃力,甚至觉得解LeetCode题目是一件相当艰巨的任务。3: 为了更好地提升自己的学习效果,我主动参与讨论,写总结,这让我更对题解有了更深的认识。
代码随想录算法训练营Day60 ||leetCode 84.柱状图中最大的矩形 这题和接雨水的题有些像,只不过此处使用的是递增栈,因为矩形的面积想要增加宽度时,需要考虑两边最低的矩形,而为了让所有数据都参加运算,需要前后补0,来弹出栈里所有元素。84.柱状图中最大的矩形。84.柱状图中最大的矩形。
代码随想录算法训练营Day59 ||leetCode 503.下一个更大元素II || 42. 接雨水 保持一个单调递减栈,当新来元素大于栈头元素时,便会出现两边大,中间小的凹槽。然后一直弹出栈头元素,直到不满足为止,这时候再将新元素入栈。主体代码与上一题一样,增添一个取余的操作来实现拼接数组的效果。503.下一个更大元素II。503.下一个更大元素II。
代码随想录算法训练营Day58 ||leetCode 739. 每日温度 || 496.下一个更大元素 I 因为nums1是nums2的子集,所以将num1哈希一下,然后把nums2按照上面单调栈的情况处理,只不过每一步需要判断一下,当遇到更大的值时,st.top()是否在哈希表中出现过。出现的话就保存结果。将每个温度对应的下标入栈,当遇到更大的值以后,将result[st.top()]=i-st.top(),循环执行,直到在再没有更小的值。496.下一个更大元素 I。
代码随想录算法训练营Day57 ||leetCode 583. 两个字符串的删除操作 || 72. 编辑距离 如果不相等,dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;dp[i][j]表示第i位开始,第j位结束的字符串是否为回文串。516.最长回文子序列。
代码随想录算法训练营Day55 ||leetCode 583. 两个字符串的删除操作 || 72. 编辑距离 如果不同,则需要增删改的操作,而增和删本质是等效的,对一个字符串删等于对另一个字符串加,所以取dp[i-1][j]和dp[i][j-1]的最小值+1。改的话则是dp[i-1][j-1]+1;如果第i位与第j位相同,那本次可以不用操作,dp[i][j]=dp[i-1][j-1]583. 两个字符串的删除操作。583. 两个字符串的删除操作。这道题的状态方程比上一题简单一些。
代码随想录算法训练营Day53 ||leetCode 1143.最长公共子序列 || 1035.不相交的线 || 53. 最大子序和动态规划 每一位的dp[i]有两个来源,分别是dp[i-1]+nums[i]和nums[i]的最大值,因此代码就好写很多。本质上是在求两个序列的最长子串的长度,如下图所示。所以代码和上一题一样,直接复制粘贴就好。这道题的难点在于递推条件的设置。53. 最大子序和 动态规划。1143.最长公共子序列。1143.最长公共子序列。1035.不相交的线。这道题难以抽象为常见题目。
代码随想录算法训练营Day52 ||leetCode 300.最长递增子序列 || 674. 最长连续递增序列 || 718. 最长重复子数组 674. 最长连续递增序列。718. 最长重复子数组。300.最长递增子序列。
代码随想录算法训练营Day51 ||leetCode 309.最佳买卖股票时机含冷冻期 || 714.买卖股票的最佳时机含手续费 309.最佳买卖股票时机含冷冻期。714.买卖股票的最佳时机含手续费。本质和122题一样,多加手续费而已。
代码随想录算法训练营Day50 ||leetCode 123.买卖股票的最佳时机III || 188.买卖股票的最佳时机IV 做完上一道题后,这道题的思路就有了,只需要把数组宽度调整为2k+1列即可,然后将本次操作与上一次操作对应即可。剩下的就是找最小的购买价格与最大的出售价格。因为股票可以买卖两次,dp数组可以这样写。123.买卖股票的最佳时机III。123.买卖股票的最佳时机III。188.买卖股票的最佳时机IV。
代码随想录算法训练营Day48 ||leetCode 121. 买卖股票的最佳时机 || 122.买卖股票的最佳时机II 和之前打家劫舍一样,设立两个元素,一个为买股票以后,自己手头的钱,第二是卖了以后,自己手头的钱。因为我们初始积蓄为0,买完以后就会是负数。所以要选最大的负数,对应了最便宜的股票。之后要找最大的股价来卖出,这样得到最高的利润。因为可以多次购买,所以持有股票时的最少钱不再是固定的-prices[i],而是。122.买卖股票的最佳时机II。121. 买卖股票的最佳时机。
代码随想录算法训练营Day47 ||leetCode 198.打家劫舍 || 213.打家劫舍II || 337.打家劫舍III 设置一个数组,记录当前位置元素的两个值,一个是偷左右节点不偷自己,一个是偷自己,不偷节点,然后使用回溯,遍历所有节点。因为首尾相连,最简单的处理方法就是分两次,一次包含头元素,一次包含尾元素。写成状态方程就会了,每一时刻的状态取决于前两次的状态。213.打家劫舍II。337.打家劫舍III。
代码随想录算法训练营Day45 ||leetCode 70. 爬楼梯 (进阶)|| 322. 零钱兑换 || 279.完全平方数 和上一道题代码相似,不过这里不存在错误值,因为任何数都可以用1来组成,所以一定有解。本质上和leetcode377一样。
代码随想录算法训练营Day44 ||leetCode 完全背包 || 518. 零钱兑换 II || 377. 组合总和 Ⅳ 此处涉及到排列情况,需要先遍历大小,再遍历容量。遍历硬币和金额,累加所有可能。518. 零钱兑换 II。377. 组合总和 Ⅳ。
代码随想录算法训练营Day43 ||leetCode 1049. 最后一块石头的重量 II || 494. 目标和 || 474.一和零 大家看到(target + sum) / 2 应该担心计算的过程中向下取整有没有影响。求解在一半容量的情况下,最多能装多重的石头。假设正数的总和为x,那么负数对应的正数,其对应的总和就是sum - x。所以我们要求的是 x - (sum - x) = target。这里的x,就是bagSize,也就是我们后面要求的背包容量。读取每个字符串中01个数,然后在二维DP数组中更新。1049. 最后一块石头的重量 II。1049. 最后一块石头的重量 II。416. 分割等和子集。
代码随想录算法训练营Day41 ||leetCode 0-1背包问题 || 416. 分割等和子集 所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);将sum/2看作背包容量,每一个数看作重量,进行遍历。如果背包恰好能装满,说明存在一个子集和为sum/2。dp[i][j]的含义:从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。二维数组简化为一维,注意背包从大到小遍历,避免重复放入第一个物品。那么可以有两个方向推出来dp[i][j],416. 分割等和子集。
代码随想录算法训练营Day39 || leetCode 762.不同路径 || 63. 不同路径 II 将障碍物及其后方的地方,dp数组初始记为0,代表这些地方无法路过。每一位的结果等于上方与左侧结果和。63. 不同路径 II。