博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 329. Longest Increasing Path in a Matrix
阅读量:6155 次
发布时间:2019-06-21

本文共 1798 字,大约阅读时间需要 5 分钟。

如果把矩阵元素看做点,小的元素到打的元素看做边连起来,这道题等价于在一个有向图中寻找最长路径。

第一想法是用dfs或bfs,但是直接做超时了。以dfs为例,时间复杂度为O(2^(m+n)),空间复杂度O(h)=O(mn)

由于dfs中很多节点的最长路径都被重复计算了,因此可以 Memorization 将结果保存下来。

 

方法一:DFS+Memoization

每条边和每个节点都只访问了一次,O(V+E),O(V)=O(mn),O(E)=O(4V)=O(mn),所以时间复杂度O(mn)

空间复杂度O(mn)

class Solution {public:    vector
> dirs={
{
0,1},{
0,-1},{
1,0},{-1,0}}; int longestIncreasingPath(vector
>& matrix) { int m=matrix.size(), n=m==0?0:matrix[0].size(); vector
> cache(m,vector
(n,0)); int res=0; for (int i=0;i
> &matrix, int i, int j, vector
> &cache){ if (cache[i][j]!=0) return cache[i][j]; int max_len=1; for (auto dir:dirs){ int x=i+dir[0], y=j+dir[1]; if (x>=0 && x
=0 && y
matrix[i][j]){ max_len = max(max_len, 1+dfs(matrix,x,y,cache)); } } cache[i][j] = max_len; return max_len; }};

 

方法二:Topological Sort

由于这道题四个方向都可以,如果用dp来做是很麻烦的,dp[i]依赖的四个方向的dp值不一定是已经求得的。所以要用DP来做的话,需要用拓扑的顺序来依次更新dp。

由于这道题比较简单,也不需要dp了,直接用拓扑排序来做。用入度做和出度做本题没区别。

class Solution {public:    vector
> dirs={
{
0,1},{
0,-1},{
1,0},{-1,0}}; int longestIncreasingPath(vector
>& matrix) { int m=matrix.size(), n=m==0?0:matrix[0].size(); vector
> indegree(m,vector
(n,0)); // calculate indegree for (int i=0;i
=0 && x
=0 && y
> q; for (int i=0;i
=0 && x
=0 && y
matrix[i][j]){ --indegree[x][y]; if (indegree[x][y]==0){ q.push({x,y}); //cout << x << ' ' << y << endl; } } } } } } return len; }};

 

转载于:https://www.cnblogs.com/hankunyan/p/9552061.html

你可能感兴趣的文章
RecycleView设置顶部分割线(记录一个坑)
查看>>
汉字转拼音 (转)
查看>>
会计基础_001
查看>>
小程序: 查看正在写的页面
查看>>
Jenkins持续集成环境部署
查看>>
MWeb 1.4 新功能介绍二:静态博客功能增强
查看>>
预处理、const与sizeof相关面试题
查看>>
爬虫豆瓣top250项目-开发文档
查看>>
有趣的数学书籍
查看>>
teamviewer 卸载干净
查看>>
eclipse的maven、Scala环境搭建
查看>>
架构师之路(一)- 什么是软件架构
查看>>
USACO 土地购买
查看>>
【原创】远景能源面试--一面
查看>>
B1010.一元多项式求导(25)
查看>>
10、程序员和编译器之间的关系
查看>>
配置 RAILS FOR JRUBY1.7.4
查看>>
AndroidStudio中导入SlidingMenu报错解决方案
查看>>
修改GRUB2背景图片
查看>>
Ajax异步
查看>>