329. 矩阵中的最长递增路径

2024-02-14 06:52
文章标签 路径 矩阵 最长 递增 329

本文主要是介绍329. 矩阵中的最长递增路径,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem: 329. 矩阵中的最长递增路径

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这是一道典型的动态规划问题,我们需要找到矩阵中的最长递增路径。我们可以通过深度优先搜索(DFS)来解决这个问题。我们从每个点开始,向上下左右四个方向进行搜索,如果下一个点的值大于当前点的值,那么我们就可以继续搜索。同时,我们使用一个二维数组dp来记录每个点的最长递增路径,如果已经计算过,就不需要再次计算。

解题方法

1.初始化一个二维数组dp,用于记录每个点的最长递增路径。
2.遍历矩阵中的每个点,对每个点进行深度优先搜索,找到从这个点开始的最长递增路径,并更新dp数组。
3.在深度优先搜索中,我们需要判断下一个点是否有效,以及下一个点的值是否大于当前点的值。如果满足条件,我们就继续搜索,并更新当前点的最长递增路径。
4.最后,我们遍历dp数组,找到最长的递增路径。

复杂度

时间复杂度:

O ( n ∗ m ) O(n*m) O(nm),其中n和m分别是矩阵的行数和列数。我们需要遍历矩阵中的每个点,对每个点进行深度优先搜索。

空间复杂度:

O ( n ∗ m ) O(n*m) O(nm),我们需要一个二维数组dp来记录每个点的最长递增路径。

Code

class Solution {public int longestIncreasingPath(int[][] matrix) {int n = matrix.length;int m = matrix[0].length;int[][] dp = new int[n][m];int ans = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {ans = Math.max(ans, dfs(matrix, i, j, dp));}}return ans;}public int dfs(int[][] matrix, int i, int j, int[][] dp) {int next = 0;if(dp[i][j] != 0) {return dp[i][j];}if (i > 0 && matrix[i][j] < matrix[i - 1][j]) {next = Math.max(next, dfs(matrix, i - 1, j, dp));}if (i + 1 < matrix.length && matrix[i][j] < matrix[i + 1][j]) {next = Math.max(next, dfs(matrix, i + 1, j, dp));}if (j > 0 && matrix[i][j] < matrix[i][j - 1]) {next = Math.max(next, dfs(matrix, i, j - 1, dp));}if (j + 1 < matrix[0].length && matrix[i][j] < matrix[i][j + 1]) {next = Math.max(next, dfs(matrix, i, j + 1, dp));}dp[i][j] = next + 1;return next + 1;}
}

这篇关于329. 矩阵中的最长递增路径的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/707804

相关文章

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

hihocoder1050 : 树中的最长路

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅仅可以拼凑成一棵二叉树!还可以拼凑成一棵多叉树——好吧,其实就是更为平常的树而已。 但是不管怎么说,小Ho喜爱的玩具又升级换代了,于是他更加爱不释手(其实说起来小球和木棍有什么好玩的是吧= =)。小Ho手

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

计蒜客 Skiing 最长路

In this winter holiday, Bob has a plan for skiing at the mountain resort. This ski resort has MM different ski paths and NN different flags situated at those turning points. The ii-th path from the

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop