class Solution {
public void setZeroes(int[][] matrix) {
}
}
如何使用O(1)的空间完成任务?诀窍在于使用矩阵的第一行、第一列存储信息
103. Binary Tree Zigzag Level Order Traversal
注意stack与queue的区别
与前一题不同的地方是给定的citation是已经排完序了,要求时间复杂度为ln(n)
这里的问题非常经典,值得好好学习。
找到第一个满足以下条件的
citations[index] >= length(citations) - index.
540. Single Element in a Sorted Array (Medium)
与上题有类似之处,可以参考学习(二分查找的原理)
121. Best Time to Buy and Sell Stock
解决方案为Kadane's Algorithm
尾插法性能较低,有什么其他方案吗?
递归倒也是不错的方案(本质上是头插法)
注意整数溢出的问题
5. Longest Palindromic Substring
边界情况的处理非常有意思
居然不是使用暴力解法,而是使用动态规划,那就更有意思了
果然有可以复用的子结构
未完待续
动态规划
可以暴力解法,也可以使用stack进行稍微优雅一点的处理
动态规划并不是最优,还有更好的解决方案(比如使用hashmap
)
排序与优先队列的使用
3. Longest Substring Without Repeating Characters
暴力解法性能底下
采用滑动窗口的处理方案 [i, j)
这道题目非常有意思,重点在于"01"这类ip地址组成部分是不合法的。
这道题目不同于一般的回溯问题,关键在于不考虑combination中元素的顺序
这道题目与上面一样,难点都是在于不考虑combination的顺序
这样就不是常规的dfs了,可能需要修改一下认知模型
这类问题,我们统一的解决方案是:要求后加入prefix的元素必须必prefix中所有元素都要大
与上面不同点,在于candidates里面的元素只能被使用一次(但是允许重复)
- prefix本来是有序的,如果我们的combination无序,那么我们将candidates排序即可
- 我们一开始处理candiates是unique的,如果可以重复,那么我们必须使用set在同一层过滤
LRU的设计与实现:主要难点在于key->ts
的存储与更新
4. Median of Two Sorted Arrays
动态规划
70, 62(简单题)
926, 845(从右往左、从左往右,然后再合并)
801,926,790,818(dp[i][0], dp[i][1], 第二维是常数维)
经典题总结
关键在于对0的处理
0-1背包问题
两种背包问题的扩展
- 完全背包
- 多重背包
partial sum in each node
题目:307、315
难点在于对于时间复杂度的要求, log(n)