有时候增加一个全局变量也可以大大的简化逻辑
5. 最长回文子串
感觉这个题要往心里刻一刻,动态规划的方案,最开始想的是状态状态转移方程是f(n) 代表了以n结尾的最长会问串,但是这样的话,是无法从f(n)推断出来f(n+1)的,直观上觉得可以,实际上不可以,所以可能需要增加一维状态,就是f(i,n)代表了s[i:n] 是否是回文串,这样的话状态才能涵盖所有的情况。在当前状态不能涵盖所有的情况下,试试修改一下状态,增加一下维度,这或许是一个比较好的方法。
这个问题,说白了,还是状态没有整对,导致状态转移方程不对,我们的状态并不一定是直接的问题的解,可能需要通过遍历状态才能真正找到问题的解。就像这里的状态实际上是s[i;j] 是不是回文串,通过遍历i来逐步得到。而不是直接定义最长回文子串来求解。
单词拆分和回文子序列一样,只是回文子序列咋一看的话掩盖了问题的复杂性,其实是需要很多子的中间状态来得到最终的状态的
这个和最长括号要对比着来看
最长有效括号
这种对称的,要想到是否可以使用栈来规划处理
k个链表合并
31. 下一个排列-有点找规律,trick略多
这个问题的主要learning是,我可以把步骤做的更简单,但是步骤多一些,这样不就更容易一些了么
# 这个逻辑上稍微复杂一些
# 1. 从后往前,查找到第一个降序序列位置i
# 2. 从len到i查找第一个大于i的数字,交换 (这里得到的learning就是不要着急,多加异步判断也没有啥啊)
# 3. i->len需要变成最小的,两两交换即可
33. 搜索旋转排序数组
和旋转数组的最小值对比
39. 组合总和
不重复,还是要注意哦,所以不能回头取值
42. 接雨水
对比一下这个那个数组容量的问题,感觉有点相似
48. 旋转图像-好难-找规律
55. 跳跃游戏-耗时超长
62. 不同路径-这么简单,为何脑子瘸了
75. 颜色分类-细节也要处理哦-数组双指针的处理逻辑-3指针的并不好搞啊
这个看题解的时候说用的是单指针,你可以思考一下啥叫单指针,通过单指针变形的双指针确实更容易写出来,但是像你最开始用的双指针的方式就比较难以写出来了。
76. 最小覆盖子串
不要怕复杂,先试试看看能否想出来一个可行解
84. 柱状图中最大的矩形-这个需要和接雨水之类的联合起来思考,其实不是很难,主要是思路上分解问题,同样存在并不是所有的子问题都是正确的问题
85. 最大矩形-柱状图变形
94. 二叉树的中序遍历-熟悉一下迭代方式
96. 不同的二叉搜索树-在没有头绪的时候想想动态规划-数据结构处理一下也更容易使用和理解
124. 二叉树中的最大路径和-hard自己一遍ac了 定义一个全局变量,这种方式也是很有效啊,简化了返回参数的个数
128. 最长连续序列-第一次做的时候看到时间要求直接蒙了,先想想穷举可以不,然后再优化就行了,别怕
139. 单词拆分-这个动态规划的题目不算很难,就是要判断清楚状态转移方程,先不要求取最好的解法,看看可以用穷举的方式
208. 实现 Trie (前缀树)
这个实际上是类似于桶排序的标记法,所以可能有点不适应,算是一种思维方式,需要去适应一下
215. 数组中的第K个最大元素-稍微变形了一下,这个可以多做两遍
快排中的partion中的低位一定要有等于,因为选择的是左侧
226. 翻转二叉树-紧张到忘词
279. 完全平方数-这个竟然做出来了,需要注意的是状态转移方程,和前面的区分
287. 寻找重复数-有点难搞战略放弃
301. 删除无效的括号-转化为之前的有重复字符串的排列组合问题
394. 字符串解码
娃子,栈里面可以存分块的数据哦
406. 根据身高重建队列 吧问题拆解为简单的问题的组合
416. 分割等和子集 背包问题过久了又忘了
讨论清楚条件,边界,是否会有负值等
讲一下思路,是否可以,或者说希望给一些提示
也可以先思考一下暴力的解法
分析一下时间复杂度
有时候使用hashmap, hashset可以大大降低难度,还有大顶堆,小顶堆,stack等的应用
总结整理一下背包问题
感觉目前分为备选集是无限的和有限的两类,
无限的代表题目是硬币凑整题目
322. 零钱兑换
有限的题目就是背包问题和416. 分割等和子集
目前看有限的复杂度要远远大于无限的复杂度,因为有限的dp状态实际上只有一个变量,就是当前的钱数(或者说背包的容量)
但是有限的背包问题,状态是当前的背包容量,以及当前可以选的子集
感觉