- 博客(50)
- 收藏
- 关注
原创 代码随想录算法训练营第六十天 | 84.柱状图中最大的矩形
1. 核心思路就是求左右比中间小的第一个值,所以让单调栈保持单调递增。4. w * h = area, 求max area。5. 左右需要加0,解决edge case(看解析。84.柱状图中最大的矩形。
2023-06-05 14:00:17
235
原创 代码随想录算法训练营第五十九天 | 503.下一个更大元素II、 42. 接雨水
2. 可得到左右两边比本柱长的柱子,然后两个柱子取最小。4. 左右两个柱子坐标相减得到宽度(需额外减一)5.相乘得到面积,累加到sum里面。3. 和本柱子相减得到高度。503.下一个更大元素II。在结尾处多了一次循环。1. 运用单调循环栈。
2023-06-05 10:47:50
207
原创 代码随想录算法训练营第五十八天 | 739. 每日温度、 496.下一个更大元素 I
思路大体和上一题一致,多了一个hashmap来存储下标,以此来做nums1和nums2的元素对应。将res[]所有元素在开始时初始化成-1,滞留在栈内的nums1的元素直接默认为-1。本题运用了单调递增来寻找下一个更大元素。单调栈保持了栈内元素单调递增或者递减。496.下一个更大元素 I。本题stack存储下标。
2023-06-01 10:03:22
247
原创 代码随想录算法训练营第五十七天 | 647. 回文子串、 516.最长回文子序列
c) i - j > 1, 根据dp[i + 1][j - 1]是否是true来判断 -- dp[i][j] == dp[i + 1][j - 1]1. 从一个单词的每单个字母(奇数length)或者一对字母(偶数length)开始向左右扩展,挨个检查是否回文。1. 如果s[i] == s[j], dp[i][j] = dp[i+1][j-1] + 2;b) i - j == 1, 直接dp[i][j]等于true。1. dp[i][j] 代表以word从下标i到j是否是回文(左闭右闭)
2023-06-01 05:21:37
226
原创 代码随想录算法训练营第五十六天 | 583. 两个字符串的删除操作、72. 编辑距离
583. 两个字符串的删除操作解法:代码随想录题目:- LeetCode题目和1143. Longest Common Subsequence思路一致,再得出longest common subsequence后最后多一个计算删除操作的计算。class Solution { public int minDistance(String word1, String word2) { int[][] dp = new int[word1.length() + 1][wo
2023-05-31 10:15:41
164
原创 代码随想录算法训练营第五十五天 | 392.判断子序列、115.不同的子序列
当s.charAt(j) == t.charAt(i)时, dp[i + 1][j + 1] = dp[i + 1][j] + dp[i][j];note:这题和上题单个格子所代表的不是length而是solution的个数(所以不是简单加一位length的问题)首先dp[i + 1][j + 1]的数量包含dp[i][j]的数量,并且包含dp[i + 1][j]的数量。dp[i][0这一列初始化为0,因为当s为空集时不可能有任何solution。以eg1为例,t控制dp[]坐标,s控制dp[][]坐标。
2023-05-29 10:48:15
271
原创 代码随想录算法训练营第五十三天 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和
心得:做类似二维需要二维dp的题目,建议把样例的结果写出来,或许可以倒着退思路。dp[i]代表0-i的subarray(连续)最大合。把dp数组压缩了成了1。1143.最长公共子序列。1035.不相交的线。
2023-05-29 07:32:46
128
原创 代码随想录算法训练营第五十二天 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
4.利用一个variable来记录最大长度,最大长度不一定就出现在dp[dp.length - 1]3.通过2得出如果nums[i]大于nums[j]那么dp[i]等于dp[j] + 1。2.dp[i]代表以i为结尾的subarray的最长增长子序列的个数。思路如图所示 (0,0)设为0, 为非法坐标。1.需要两个for loop, 定义i和j。思路简单,用贪心或者dp都可以做。674. 最长连续递增序列。718. 最长重复子数组。300.最长递增子序列。
2023-05-28 08:21:36
82
原创 代码随想录算法训练营第五十一天 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
这道题我觉得只用三个状态更好理解,设立一个冷却期冷却期的值就是卖后的值,而持有期基于冷静期来计算。714.买卖股票的最佳时机含手续费。这道题就是2的变体加个fee就行了。309.最佳买卖股票时机含冷冻期。
2023-05-27 09:43:15
300
原创 代码随想录算法训练营第五十天 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV
当第一次买入相对最大利润确定,第一次买入相对保持静态,因为第二次持有取决于第一次为持有的时候最大值,当有合适价格出现,第二次买入价格会被刷新,然后等待第二次卖出的最高峰(如果有)再次买出。第二次的买入的初始持有值是-prices[0]是因为一天内可以多次买入和卖出,在第一次买入结束前,第一次买入和第二次买入都是所有状态保持相等。额外要点就是如何用loop初始化和赋值。123.买卖股票的最佳时机III。188.买卖股票的最佳时机IV。1,2的结合进阶版。
2023-05-26 11:11:30
79
原创 代码随想录算法训练营第四十九天 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
那么第i天持有股票即dp[i][0],如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 即:dp[i - 1][1] - prices[i]。第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]而本题,因为一只股票可以买卖多次,所以当第i天买入股票的时候,所持有的现金可能有之前买卖过的利润。
2023-05-24 12:34:16
70
原创 代码随想录算法训练营第四十八天 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III
为了满足首尾不能同时取值,把环形拆成0 - length - 1和 1 - length的两个区域分别求最大值,最后比较。关键是通过建立一个长度为二的数组确立好每个点偷和不偷的情况。当时就是看了这道题再b站的解析才知道的卡哥,哈哈。post traversal自下而上的递推。dp[i]等于i标的最大利益。337.打家劫舍III。213.打家劫舍II。
2023-05-24 06:34:01
83
原创 代码随想录算法训练营第四十五天 | 70. 爬楼梯、322. 零钱兑换、279.完全平方数
初始化一开始没弄对,注意因为是求相对较小个数,要除了res[0]意外的下标初始化成amout + 1, 或者Integer.MAX_VALUE.这道题思路因为res[j]代表的是钱币的个数,所以每次+1.思路和细节与上题完全一致,就是注意在遍历背包是将物品值平方。思路一致,就是“物品”要自己定义成{1,2}以下才用了先物品再背包。377. 组合数II。
2023-05-20 11:34:42
86
原创 代码随想录算法训练营第四十四天 | 518. 零钱兑换 II、377. 组合总和 Ⅳ
dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。就是里面的对于背包的循环改成正循环以体现物品(硬币)的个数不限。先遍历物品再遍历背包是组合数(不含重复)先遍历背包再遍历物品是(含重复)1518. 零钱兑换 II。377. 组合总和 Ⅳ。
2023-05-19 13:39:22
105
原创 代码随想录算法训练营第四十三天 | 1049. 最后一块石头的重量 II、494. 目标和、474.一和零
个人认为这里和一个数字的的0次幂等于1的意义相同,至于为什么一个数字的的零次方等于1,这是一个数学问题。在这个结论的基础上进行反推,dp[5](装满容量为5的背包的方法)也就等于吧所有dp[j - nums[i]]相加。(nums[i]为当前被给予的物品的质量)值得一提的是{0} target = 0所得到的结果是2(1+1)不是1,分别为+0和-0.取石头总量的一半,然后以这一半为“背包”,看看最大能填满多少。至少存在dp[3]种方法来装满dp[5]的背包。求stones[target]的逻辑和。
2023-05-19 11:22:53
73
原创 代码随想录算法训练营第四十二天 | 416. 分割等和子集
真的理解不能,还在理解之中,不是很明白为什么这么做就可以满足可以array可以平分并且等于sum。416. 分割等和子集。
2023-05-17 13:54:50
239
原创 代码随想录算法训练营第四十一天 | 343. 整数拆分、96.不同的二叉搜索树
3. 新的状态值还是根据前一层状态值得到。2. += 是累计一层从1到i的合。自从开始做dp,几乎自理不能。96.不同的二叉搜索树。
2023-05-15 11:07:03
122
原创 代码随想录算法训练营第三十九天 | 62.不同路径、63. 不同路径 II
核心思路和上题一致,在初始化需要额外考虑遇到障碍的情况。63. 不同路径 II。
2023-05-14 11:47:00
68
原创 代码随想录算法训练营第三十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
746. 使用最小花费爬楼梯。509. 斐波那契数。
2023-05-12 22:12:02
138
原创 代码随想录算法训练营第三十七天 | 738.单调递增的数字
思路和解析差不多,我是在for loop的时候一个个set 9,解析做法for loop打了一个坐标,最后以坐标为起点set 9.然后学会了如何将int 转换成char Character.forDigit(pre - 1, 10);看了解析明白,char可以不用换成int再比较,可以直接比较。738.单调递增的数字。
2023-05-12 09:54:58
332
原创 代码随想录算法训练营第三十六天 | 435. 无重叠区间、763.划分字母区间、56. 合并区间
思路和解析完全一致,这道题在今年二月份做过当时边界判定判定了半天,已经忘了当时边界判定怎么搞的那么复杂。这道题思路和上面大差不差,几乎雷同。右边排序记录不重合的区间的数量,return intervals.length - count;但是我提前了一位,所以要在末尾额外加一次。而且用了hashmap导致变慢。思路一致,这个和射气球一个思路, 我是按照左边界排序,记录要删除的区间的数量。435. 无重叠区间。763.划分字母区间。
2023-05-11 10:49:05
62
原创 代码随想录算法训练营第三十五天 | 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球
自己写的时候int overflow了,因为用的a[0] - b[0], 应该用 Integer.compare(a[0], b[0])),而且写完才发现,start没有用,只需要记录end。转化格式:que.toArray(new int[people.length][]);逻辑一样,解析的方法更巧妙省去了end直接更改上一个ballon的值。关键点在于量化5,10的硬币数量,剩下根据规则写就行。1. 身高从大到小排(身高相同k小的站前面)整个就是一个不会,照着解析写一遍。406.根据身高重建队列。
2023-05-10 15:53:48
101
原创 代码随想录算法训练营第三十四天 | 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果
1.关键是利用了如果[0,i]这个区间如果i的sum等于0那么0-i的任何一个点都不能作为初始起点,接着将i+1.设为起点。这道题的暴力解法虽然超时但是也值得一看,通过 i + 1 % gas.size()来模拟circular motion。这样从局部最优推出了全局最优,即:相邻的孩子中,评分高的孩子获得更多的糖果。(此方法利用了pq自动排列大小的特性,个人觉得还挺巧妙)3.重新poll最小值重复以上操作,直到k == 0。2. 将最小的值变负之后,重新加入pq,k--
2023-05-09 15:00:11
59
原创 代码随想录算法训练营第三十二天 | 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
做的七窍生烟,未果,看答案。精髓就在与设置两个变量currendEnd和nextBiggestRange,在当前步数余额耗尽的情况(i==end)并且未达到末尾index if (end < nums.length - 1), 步数加一(ans++)如果达到末尾index直接++后return ans。简写:(个人感觉,简写就避免把0的情况单独考虑,融入主逻辑里面)在达到末尾前index 并且i == end情况下自动ans++(感觉简写逻辑更复杂一点不是很直观,还是正常写的逻辑更清晰明了)
2023-05-07 19:37:33
52
原创 代码随想录算法训练营第三十一天 | 455.分发饼干、376. 摆动序列、53. 最大子序和
这道题有思路但是没有实现出来,等于没有思路。看了官方的贪心思路做的。感觉贪心是找到普遍规律,将每个问题分解,找到每个字问题的通用最profitable的解法,最后实现每个子问题的利益最大最终实现宏观问题的最大化(?做过,这道题思路还是适用于上面写的那句抽象佳句。除此之外,额外的考虑的就是,当之前所有的sum给当前值带来负收益(num[i] > nums[i] + sum)抛弃之前所有的sum。一开始for loop写的是基于孩子的数量而不是饼干的数量导致运行时间变长,其实决定答案的是饼干的数量。
2023-05-06 13:29:38
50
原创 代码随想录算法训练营第二十九天 | 491.递增子序列、46.全排列、47.全排列 II
这道题查重可以直接用hashset,不需要额外的用题解里的used array,或者hashmap。*同层去重:used[i - 1] == false (快,直接剪枝)*树枝去重:used[i - 1] == true(慢,需要更多搜索)楞是完全没思路,照着解析思路写了一遍,用used array更快。1. 可以用hashset去重,但是runtime极高。2. 用used array去重。
2023-05-05 14:17:54
78
原创 代码随想录算法训练营第二十八天 | 93.复原IP地址、78.子集、90.子集II
思路和昨天最后一题完全一致,可以利用目前的string buffer来剪枝。我的脑力目前无法支持stringbuilder。非常的回溯,非常的基本。核心思路就是同层去重。
2023-05-03 09:48:29
56
原创 代码随想录算法训练营第二十七天 | 39. 组合总和、40.组合总和II、131.分割回文串
做的时候用的string builder,在考虑如何同时操纵stringbuilder和deque脑力发生了爆炸。思路和解法一致,但是没有考虑到用 sum + candidates[i] <= target剪枝的情况,用了之后速度真的是提高了一个非常大的level啊。思路一致,但是没有加提前sort,sort的话确保在遇到大于target的值直接return省去了一些runtime?这道题死磕了俩小时没做出来,终止条件想出来了,分割分了一辈子,做的脑子冒烟,最后看着解析一步一步理解又做了一遍。
2023-05-02 12:27:09
59
原创 代码随想录算法训练营第二十五天 | 216.组合总和III、17.电话号码的字母组合
竟然做出来了,看了解析思路是一样的。就是解析用了一个String[] 而不是 char[] []这样 就剩去了。这类题还是要现在脑子里或者纸上画好树,然后决定如何用for决定宽度和递归决定深度。本质上思路和昨天的题combinations是一样的。就是多了一个sum判定。' '的判定,直接小于string[idx].length()就行。17.电话号码的字母组合。216.组合总和III。
2023-05-01 13:20:33
62
原创 代码随想录算法训练营第二十四天 | 77. 组合
在集合n中至多要从该起始位置 : n - (k - path.size()) + 1,开始遍历。还需要的元素个数为: k - path.size();已经选择的元素个数:path.size();
2023-04-30 20:25:31
55
原创 代码随想录算法训练营第二十三天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
这道题一开始用的pre order挂了,然后debug改成了post order所以说需要这种从下往上扫的情况就用post order。这道题做过,每次取数组中间数建node,设置high和low来控制边界,个人用的左闭右闭。以后先审题后想清楚用什么order再开始写。108.将有序数组转换为二叉搜索树。538.把二叉搜索树转换为累加树。669. 修剪二叉搜索树。
2023-04-27 07:55:16
53
原创 代码随想录算法训练营第二十二天 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
个人思路和解法差不多,可能有写法可以略微简化。主要思路就是需要一个while loop来找到继任的node的最小值然后把root.left赋值给最小值的left。235. 二叉搜索树的最近公共祖先。701.二叉搜索树中的插入操作。450.删除二叉搜索树中的节点。
2023-04-26 06:38:34
57
原创 代码随想录算法训练营第二一天 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
个人思路和解法一致,其实本质上和上题差不多,一次遍历就可以,一边遍历一边记录修改,需要多用几个global variable来check边际条件,check不仔细导致第一次没有ac。思路是dfs的递归版本,在traversal上设置一个pre node,不断取node.val - pre.val最小值。解法真是妙妙妙,妙到家了,妙到很难总结。个人思路虽然过了但是运行速度垫底。递归嵌套递归,速度爆炸。530.二叉搜索树的最小绝对差。236. 二叉树的最近公共祖先。501.二叉搜索树中的众数。
2023-04-25 09:14:29
62
原创 代码随想录算法训练营第二十天 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
这道题,个人思路重新建造了一个二叉树,看了解析其实可以直接改变root1,root2其中一个就行。这道做过,但是这次又没有ac,因为又忘了相等值 eg : (2,2,2)的情况。思路和解法一致,都是左闭右开 [right, left) 细节处理稍微不同。用的递归,思路简单,看代码就明白。dfs迭代也可以写成递归版本。700.二叉搜索树中的搜索。98.验证二叉搜索树。
2023-04-24 11:31:47
52
原创 代码随想录算法训练营第十八天 | 513.找树左下角的值、112. 路径总和、113. 路径总和ii、105.从前序与中序遍历序列构造二叉106、从中序与后序遍历序列构造二叉树
这道题月初刚好做过,所以还有印象,第一次做没做出来,本质就是利用preoder(从前往后依次)来确定下一次需要建立node的值,然后用inorder(利用map储存node的值和对应index)来限定node.left和node.right的区间(先处理左边再处理右边)和终止条件。这种方法在回溯的的时候,每一个node都在下次回溯删除,所以最后会剩下root。这种在每次回溯时,自己最后删除自己,所以最后root也不会剩下。这道题直接用的bfs的迭代,比较容易,递归有时间再说吧。113. 路径总和ii。
2023-04-23 13:18:41
52
原创 代码随想录算法训练营第十七天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和
我的写法是传入string就行,每次用stringbuilder来改变string,只有遇到node.left node.right都为null的情况直接处理string后添加到list里,其余情况不添加。个人思路多了一个boolean来判断此node是否为left node。但是解法的思路多了一个mid value这样就不需要多余一个boolean来判定,真的很巧妙。解法的思路是又多了一个储存string的list,我觉得有点麻烦了。但是重点在与每一次回溯删除上一个node这样就不会被添加的其他分支。
2023-04-22 08:55:21
55
原创 代码随想录算法训练营第十六天 | 104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
2.数最后一行少了几个node,递归当到倒数第二行的时候,从最右到最左的node开始check它的left and right node,少1个减1,少2个减2,递归终止与只少1或少2情况。1.如果node的left sub tree和right sub tree满了且level一致则根据level计算总nodes个数。相比于上题,中间添加的两行判定保证了每一条path的最终点是一个left和right都为null的node。3.最后 total = 根据层数计算得到的总node 减去 少去的node。
2023-04-20 13:21:08
113
原创 代码随想录算法训练营第十五天 | 226.翻转二叉树、101. 对称二叉树
这道题也做过,关键在于每次递归检查镜像位置node的val,所以parameters中的left和right应该保持镜像位置。之前二叉树做的题最多。这道题做过,直接递归,思路很直接。101. 对称二叉树。
2023-04-20 05:06:54
173
原创 代码随想录算法训练营第十三天 | 239. 滑动窗口最大值、347.前 K 个高频元素
这道题想到了用hashtable和priority queue但是完全不知道以什么形式来申明 priority queue,所以直接看了解析,然后做了一遍。做了俩小时没做出来,看了解析理解了一下思路,精疲力尽,有时间再实现一下。347.前 K 个高频元素。239. 滑动窗口最大值。
2023-04-17 12:06:19
63
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅