当前位置: 首页 > wzjs >正文

安远网站建设海外社交媒体营销

安远网站建设,海外社交媒体营销,一建报考专业,随州网站推广哪家专业矩阵最长递增路径问题 题目描述数据范围:进阶要求:示例示例 1示例 2 题解思路算法步骤:代码实现代码解释复杂度分析总结 题目描述 给定一个 n 行 m 列的矩阵 matrix,矩阵内所有数均为非负整数。你需要在矩阵中找到一条最长路径&a…

矩阵最长递增路径问题

      • 题目描述
      • 数据范围:
      • 进阶要求:
      • 示例
        • 示例 1
        • 示例 2
      • 题解思路
      • 算法步骤:
      • 代码实现
      • 代码解释
      • 复杂度分析
      • 总结

题目描述

给定一个 n 行 m 列的矩阵 matrix,矩阵内所有数均为非负整数。你需要在矩阵中找到一条最长路径,使得这条路径上的元素是递增的。并输出这条最长路径的长度。

该路径必须满足以下条件:

  1. 对于每个单元格,你可以往上、下、左、右四个方向移动。不能在对角线方向上移动或移动到边界外。
  2. 你不能走重复的单元格。即每个格子最多只能走一次。

数据范围:

  • 1 ≤ n, m ≤ 1000
  • 0 ≤ matrix[i][j] ≤ 1000
    在这里插入图片描述

进阶要求:

  • 空间复杂度:O(nm)
  • 时间复杂度:O(nm)

示例

示例 1

输入

[[1,2,3],[4,5,6],[7,8,9]]

返回值

5

说明
最长递增路径为:1 -> 2 -> 3 -> 6 -> 9

示例 2

输入

[[1,2],[4,3]]

返回值

4

说明
最长递增路径为:1 -> 2 -> 3 -> 4

题解思路

这个问题可以通过 深度优先搜索(DFS)结合 动态规划(DP)来高效地解决。关键思路是:

  1. 深度优先搜索(DFS):我们可以对每个元素进行深度优先搜索,查找从该元素出发的最长递增路径。
  2. 动态规划(DP):我们可以在 DFS 搜索的过程中利用动态规划来避免重复计算相同位置的路径长度,从而提高效率。

算法步骤:

  1. 初始化

    • 创建一个 dp 数组,记录每个位置的最长递增路径长度。
    • 遍历每个单元格,使用 DFS 算法寻找每个单元格的最长路径。
  2. DFS 搜索

    • 对每个位置 (i, j),判断其四个邻接位置(上、下、左、右),如果邻接位置的值大于当前值,则递归搜索该邻接位置。
    • 使用 dp[i][j] 存储从 (i, j) 出发的最长递增路径,避免重复计算。
  3. 结果

    • 在遍历所有单元格后,dp 数组中的最大值即为矩阵中的最长递增路径。

代码实现


#include <stdio.h>
#include <stdlib.h>// 定义方向数组,表示上下左右四个方向
int directions[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};/*** 深度优先搜索(DFS)函数,用于计算从 (x, y) 开始的最长递增路径* * @param matrix 二维数组,表示矩阵* @param x 当前位置的行索引* @param y 当前位置的列索引* @param m 矩阵的行数* @param n 矩阵的列数* @param count 当前路径的长度* @return 从 (x, y) 开始的最长递增路径长度*/
int dfs(int** matrix, int x, int y, int m, int n, int count) {// 如果超出矩阵边界,返回当前路径长度if (x < 0 || x >= m || y < 0 || y >= n) {return count;}int maxPath = count; // 初始化当前最大路径长度为当前路径长度// 遍历四个方向for (int i = 0; i < 4; i++) {int nx = x + directions[i][0]; // 计算相邻位置的行索引int ny = y + directions[i][1]; // 计算相邻位置的列索引// 如果相邻位置超出矩阵边界,跳过if (nx < 0 || nx >= m || ny < 0 || ny >= n) {continue;}// 如果相邻位置的值小于当前位置的值,说明可以继续递增if (matrix[nx][ny] < matrix[x][y]) {// 递归调用 dfs,计算从相邻位置开始的路径长度int temp = dfs(matrix, nx, ny, m, n, count + 1);// 更新最大路径长度maxPath = maxPath > temp ? maxPath : temp;}}return maxPath; // 返回从 (x, y) 开始的最长递增路径长度
}/*** 主函数,计算矩阵中的最长递增路径* * @param matrix 二维数组,表示矩阵* @param matrixRowLen 矩阵的行数* @param matrixColLen 矩阵的列数* @return 矩阵中的最长递增路径长度*/
int solve(int** matrix, int matrixRowLen, int* matrixColLen) {// 如果矩阵为空或行数为0,返回0if (matrixRowLen == 0 || matrix == NULL) {return 0;}int m = matrixRowLen; // 矩阵的行数int n = matrixColLen[0]; // 矩阵的列数int maxLength = 0; // 初始化最长递增路径长度为0// 遍历矩阵的每个位置for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 从每个位置调用 dfs,计算从该位置开始的最长递增路径int pathLength = dfs(matrix, i, j, m, n, 1);// 更新最长递增路径的长度maxLength = maxLength > pathLength ? maxLength : pathLength;}}return maxLength; // 返回矩阵中的最长递增路径长度
}// 测试函数
int main() {// 定义一个示例矩阵int matrix[4][4] = {{9, 9, 4, 5},{6, 6, 8, 7},{2, 1, 1, 3},{3, 4, 2, 1}};int m = 4; // 矩阵的行数int n = 4; // 矩阵的列数// 将二维数组转换为指针数组int* matrixPtr[4];for (int i = 0; i < m; i++) {matrixPtr[i] = matrix[i];}// 定义列数数组int matrixColLen[4] = {n, n, n, n};// 调用 solve 函数,计算最长递增路径int maxLength = solve(matrixPtr, m, matrixColLen);// 打印结果printf("The longest increasing path length is: %d\n", maxLength);return 0;
}

代码解释

  1. dp 数组初始化dp 数组用于记录从每个单元格出发的最长递增路径。初始化时设置为 -1,表示该位置尚未计算过。

  2. DFS 函数

    • dfs(i, j) 是递归函数,用于计算从位置 (i, j) 开始的最长递增路径。
    • 首先检查 dp[i][j] 是否已经计算过,如果计算过,则直接返回 dp[i][j]
    • 否则,初始化最长路径为 1,即当前位置本身。
    • 对于当前位置 (i, j),检查其四个邻接位置,如果邻接位置的值大于当前值,则递归计算该邻接位置的最长路径,并更新当前路径长度。
    • 最终返回 dp[i][j]
  3. 主函数

    • 遍历整个矩阵,对每个位置调用 dfs 函数,并更新最大路径长度 max_path
    • 最终返回最大路径长度。

复杂度分析

  1. 时间复杂度O(nm),每个位置最多计算一次。递归时,通过 dp 数组避免了重复计算。

  2. 空间复杂度O(nm),需要一个 dp 数组来存储每个位置的最长递增路径长度。

总结

这个问题使用 DFS 和动态规划的结合来有效地求解,避免了重复计算,提高了性能。通过合理使用 np 数组,我们可以确保每个位置的最长路径只计算一次,从而将时间复杂度降低到线性级别。
这题整体难度一般,和之前的求岛屿数量完全类似。但是仔细想想还是要多多注意,比如它还是要遍历整个数组,因为从任何路径走都是有可能的。另外幸好是单调递增,如果是单调非减的话就麻烦很多,因为单调非减会不停来回震荡,就很麻烦。

http://www.dtcms.com/wzjs/476499.html

相关文章:

  • h5网站做微信小程序steam交易链接怎么改
  • 网站建设天津优化防控举措
  • 公众号文章模板素材免费seo网站
  • 什么叫响应式网站如何写好一篇软文
  • 网络推广软件免费重庆seo排名电话
  • 手机软件开发网站湖南专业关键词优化服务水平
  • 宁波网站推广多少钱一个石家庄关键词排名提升
  • 开个做网站的公司深圳优化排名公司
  • 怎样做网站外部链接seo属于什么职业部门
  • 如何做网站吸引广告商关键词数据分析工具有哪些
  • cdr做图时怎么找到网站的龙岗网站制作
  • 国外域名注册商排名南宁哪里有seo推广厂家
  • wordpress个人唯美主题关键词优化公司推荐
  • 网站建设一般用什么语言好怎样申请网站
  • 设计师个人作品展示网站百度合伙人官网app
  • 菏泽网站建设哪好百度搜索排名购买
  • 网站建设后续需要维护网络推广需要多少钱
  • 北京中高端网站建设公司外贸公司一般怎么找客户
  • 中国建设通网站郑州seo网站排名
  • 高端网站建设软件开发百度收录什么意思
  • 旅游网站开发论文摘要百度竞价开户渠道
  • 做网站与平台的区别百度知道首页官网
  • 网络推广方案的工作安排seo是什么职业做什么的
  • 广告企业网站模板关键词组合工具
  • 上海心橙科技网站建设网络推广网站大全
  • 桂林的网站建设公司长春网站建设定制
  • 网站开通后网站关键词优化方案
  • 网站界面设计的流程无锡seo公司
  • 婚纱外贸网站国内疫情最新消息
  • 茌平做创建网站公司seo推广优化多少钱