329. 矩阵中的最长递增路径
回溯(超时)
1 | class Solution { |
优化,记忆化dfs
因为前面走过来的路必然是小于当前的数字的,而接下来可以走的路必然是大于当前数字的,因此不用担心会走回头路。
而对于记忆化来说,不用担心这个记忆化的结果是从那边走来的,只需要知道获取这个记忆化数据的这一格必然大于记忆化的这一格,所以不可能是之前走过的路
1 | class Solution { |
dp,拓扑排序
从出度为0的点开始bfs,出度为0表示是矩阵中最大的点。然后往前bfs则表示往前一步走,当不能继续dfs时候就表示走到头了,具体看题解-方法二
1 | class Solution { |
题解中思考题的回答
「方法一」中使用了记忆化存储和深度优先搜索,这里的深度优先搜索可以替换成广度优先搜索吗?
不能,因为需要记录的是最长路径,而广度优先搜索只能记录一个层次的值
「方法二」中基于拓扑排序对排序后的有向无环图做了层次遍历,如果没有拓扑排序直接进行广度优先搜索会发生什么?
拓扑排序决定了dp的顺序,dp上一步决定下一步的值
「方法二」中如果不使用拓扑排序,而是直接按照矩阵中元素的值从大到小进行排序,并依此顺序进行状态转移,那么可以得到正确的答案吗?如果是从小到大进行排序呢?
可以,但慢,时间复杂度O(MNlog(MN))