[leetcode 329]Longest Increasing Path in a Matrix 原创解法
题目概述
Given an integer matrix, find the length of the longest increasing path
From each cell, you can either move to four directions: left, right, up or down. You may NOT move diagonally or move outside of the boundary (i.e. wrap-around is not allowed).
example:
nums = [
[9,9,4],
[6,6,8],
[2,1,1]
]
return 4
回溯法
首先想到的就是回溯法(backtracking)。思路也很简单,就是遍历每个位置, 并以此位置的数字作为开始,向四个方向进行回溯遍历。最终找到最长的序列。 以下代码的36行和38行进行回溯。不过毫无疑问超时了。在这个基础上还可以 进一步优化,比如只对in-degree为0的位置的数字进行考察。但是还是不行。
1 |
|
拓扑排序和记忆体
看看leetcode会给我们什么提示呢?点开show tags
可以看到这个问题的标签,
Topological Sort
和Memoization
。既然使用topsort那么肯定要把这个问题
转化为DAG问题了。如此一来,令人想到,可以先把矩阵数字使用topsort排成
一排,然后再利用曾经遇到的求解最长递增子序列的动态规划算法进行求解。
以下是实现的代码,拓扑排序加动态规划。
1 |
|
进一步优化
上边的解法还是超时了,时间不会消耗在topsort上,因为这个方法是O(|V|+|E|)
的。
主要的时间花在了动态规划上,因为这是一个O(N^2)
的算法。
我们仔细看看第72到76行这个内循环,发现遍历所有当前节点之前的节点是无效的。
因为可以进入当前节点的节点不会超过4个。所以我们可以修改一下这个内循环。
1 |
|
这里我们在16行使用一个dict来代替之前的memo,
这样就可以把一个O(N^2)
改成一个O(N)
的了。
测试一下,幸运的通过了。不过只打败了1.7%
。
[leetcode 329]Longest Increasing Path in a Matrix 原创解法
https://threelambda.com/2017/03/12/2017-3-12-leetcode-329/