BM61 矩阵最长递增路径

这篇具有很好参考价值的文章主要介绍了BM61 矩阵最长递增路径。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目 矩阵最长递增路径

给定一个 n 行 m 列矩阵 matrix ,矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径,使这条路径上的元素是递增的。并输出这条最长路径的长度。 这个路径必须满足以下条件: 1. 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外。 2. 你不能走重复的单元格。即每个格子最多只能走一次。 数据范围:, 进阶:空间复杂度 ,时间复杂度 例如:当输入为[[1,2,3],[4,5,6],[7,8,9]]时,对应的输出为5, 其中的一条最长递增路径如下图所示:
示例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

备注:
矩阵的长和宽均不大于1000,矩阵内每个数不大于1000
BM61 矩阵最长递增路径,矩阵,线性代数

BM61 矩阵最长递增路径

该题是牛客网基础算法题递61题。

暴力探索:

根据题意是每个坐标点在上下左右方向可增量延伸的最长路径。如果能够记录每个坐标点,在每个坐标探索一遍可能生成的路径,最后取最长的那条, 就是每个坐标的最长路径。最后提示时间超时了, 只能解到第二组就超时了。

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 递增路径的最大长度
 * @param matrix int整型二维数组 描述矩阵的每个数
 * @return int整型
 */
export function solve(matrix: number[][]): number {
    // write code here
    const result = {}
    const backupStack = []
    matrix.forEach((arr, y) => {
        arr.forEach((val, x) => {
            backupStack.push({ x, y })
        })
    })
    const computed = (value: number, key: string) => {
        if (Array.isArray(result[key])) {
            const maxVal = Math.max(...result[key])
            if (value > maxVal) {
                result[key].push(value)
            }
        } else {
            result[key] = [value]
        }
    }
    const callback = (y: number, x: number, key: string) => {
        if (matrix[y] && matrix[y][x]) {
            const value = matrix[y][x]
            computed(value, key)
            // left
            if (matrix[y] && matrix[y][x] < matrix[y][x - 1]) {
                callback(y, x - 1, key)
            }
            // right
            if ( matrix[y] && matrix[y][x] < matrix[y][x + 1]) {
                callback(y, x + 1, key)
            }
            // top
            if (matrix[y - 1] && matrix[y][x] < matrix[y - 1][x]) {
                callback(y - 1, x, key)
            }
            // bottom
            if (matrix[y + 1] && matrix[y][x] < matrix[y + 1][x]) {
                callback(y + 1, x, key)
            }

        }
    }
    while (backupStack.length > 0) {
        const item = backupStack.shift()
        if (item) {
            const { x, y } = item
            const key = `${y}-${x}`
            callback(y, x, key)
        }
    }
    const getLength = () => {
        const list: number[][] = Object.values(result)
        return Math.max(...(list.map(arr => arr.length)))
    }
    return getLength()
}

BM61 矩阵最长递增路径,矩阵,线性代数

理论上足够覅人时间和空间是可以解出来的,实践上在该题的要求下,时间是不满足的。

不再二次探索相同的地方.

通过观察发现其中已经探索过的节点其实不需要在继续探索了,只需要拿到已经探索过的点的最长路径就可以了,如果该节点还没有被遍历探索那么继续探索,直到走完所有节点
细节注意:因为每个方向都要判断有没路径,所以需要判断边界,只能在没有超出数据边界的情况下进行。

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 递增路径的最大长度
 * @param matrix int整型二维数组 描述矩阵的每个数
 * @return int整型
 */
export function solve(matrix: number[][]): number {
    // write code here
    const resultMap = matrix.slice(0, matrix.length).map(arr => arr.map(_ => 0))
    const dfs = (y, x) => {
        if (resultMap[y][x] > 0) {
            return resultMap[y][x]
        }
        if (resultMap[y][x] === 0) {
            resultMap[y][x] = 1
        }
        const direction = [
            [y + 1, x],
            [y - 1, x],
            [y, x - 1],
            [y, x + 1]
        ]
        direction.forEach(([nextY, nextX], k) => {
            const yL = matrix.length
            const xL = matrix[y].length
            if (
                (nextY >= 0 && nextY < yL) &&
                (nextX >= 0 && nextX < xL) &&
                (matrix[y][x] < matrix[nextY][nextX])
            ) {
                resultMap[y][x] = Math.max(resultMap[y][x], dfs(nextY, nextX) + 1)
            }
        })
        return resultMap[y][x]
    }
    const getMaxLen = () => {
        let num = 0
        matrix.forEach((arr, y) => {
            arr.forEach((_, x) => {
                num = Math.max(num, dfs(y, x))
            })
        })
        return num
    }
    return getMaxLen()
}

多学多练就能提高编程水平。文章来源地址https://www.toymoban.com/news/detail-768219.html

到了这里,关于BM61 矩阵最长递增路径的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性代数:线性方程求解、矩阵的逆、线性组合、线性独立

    本文参考www.deeplearningbook.org一书第二章2.3 Identity and Inverse Matrices 2.4 Linear Dependence and Span 本文围绕 线性方程求解 依次介绍矩阵的逆、线性组合、线性独立等线性代数的基础知识点。 本文主要围绕求解线性方程展开,我们先把线性方程写出来,方程如下: 其中,是已知的;,

    2024年02月08日
    浏览(38)
  • 0203逆矩阵-矩阵及其运算-线性代数

    定义7 对于 n n n 阶矩阵A,如果有一个 n n n 阶矩阵B,使 A B = B A = E AB=BA=E A B = B A = E 则说矩阵A是可逆的,并把矩阵B称为A的逆矩阵,简称逆阵。 定理1 若矩阵A可逆,则 ∣ A ∣ ≠ 0 vert Avert not = 0 ∣ A ∣  = 0 证明: A 可逆,即有 A − 1 ,使得 A A − 1 = E ∣ A A − 1 ∣ = ∣ A

    2024年04月13日
    浏览(47)
  • 线性代数——求逆矩阵

    利用计算技巧凑出公式:两边加E、提取公因式、没有公因式可提时利用隐形的E=AA^(-1),因为E可看作系数1 主对角线有矩阵(副对角线是0矩阵),则分别逆后放在原位置 副对角线有矩阵(主对角线是0矩阵),则分别逆后互换位置

    2024年02月11日
    浏览(38)
  • 线性代数——矩阵

    学习高等数学和线性代数需要的初等数学知识 线性代数——行列式 线性代数——矩阵 线性代数——向量 线性代数——线性方程组 线性代数——特征值和特征向量 线性代数——二次型 本文大部分内容皆来自李永乐老师考研教材和视频课。 从矩阵的转置章节到方阵和行列式

    2023年04月08日
    浏览(210)
  • 线性代数3:矩阵

    目录 矩阵研究的是什么呢? 逆阵 什么叫做逆阵?  例题1:  例题2:  逆阵的存在性 定理1: 定理2: 定理3: 定理4: 拉普拉茨方程 方阵可以的条件  例题3:  Note1: 例题4  Note2:  Note3: Note4:  Note5:  Note6: Note7:  例题5:  逆矩阵的求法: 方法1:伴随矩阵法:  方

    2024年02月13日
    浏览(43)
  • 线性代数(七) 矩阵分析

    从性线变换我们得出,矩阵和函数是密不可分的。如何用函数的思维来分析矩阵。 通过这个定义我们就定义了矩阵序列的 收敛性 。 研究矩阵序列收敛性的常用方法,是用《常见向量范数和矩阵范数》来研究矩阵序列的极限。 长度是范数的一个特例。事实上,Frobenius范数对

    2024年02月08日
    浏览(40)
  • 线性代数-矩阵的本质

    线性代数-矩阵的本质

    2024年02月11日
    浏览(36)
  • 投影矩阵推导【线性代数】

    如果两个向量垂直,那么满足。但如果两个向量不垂直,我们就将 b 投影到 a 上,就得到了二者的距离,我们也称为向量 b 到直线 a 的误差。这样就有出现了垂直:                (1) 投影向量 p 在直线上,不妨假设  ,那么误差 。带入式(1)中得到: 投影矩阵:  

    2024年02月06日
    浏览(47)
  • 线性代数:矩阵的定义

    目录 一、定义 二、方阵 三、对角阵 四、单位阵 五、数量阵  六、行(列)矩阵  七、同型矩阵 八、矩阵相等 九、零矩阵 十、方阵的行列式

    2024年01月22日
    浏览(30)
  • 线性代数基础--矩阵

     矩阵是由排列在矩形阵列中的数字或其他数学对象组成的表格结构。它由行和列组成,并且在数学和应用领域中广泛使用。 元素:矩阵中的每个数字称为元素。元素可以是实数、复数或其他数学对象。 维度:矩阵的维度表示矩阵的行数和列数。一个 m × n 的矩阵有 m 行和

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包