305 · 矩阵中的最长递增路径

news2024/10/7 6:48:37

 链接:LintCode 炼码

题解:九章算法 - 帮助更多程序员找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧

class Solution {
public:
    /**
     * @param matrix: A matrix
     * @return: An integer.
     */
    class Node {
    public:
        int x;
        int y;
        int val;
        Node(int ii, int jj, int v):x(ii), y(jj), val(v) {

        }
    };
    int longestIncreasingPath(vector<vector<int>> &matrix) {
        // Write your code here.
        if (matrix.size() <= 0) {
            return 0;
        }
        std::vector<Node> points;
        int m = matrix.size();
        int n = matrix[0].size();
        points.reserve(m*n);
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                points.push_back(Node(i, j, matrix[i][j]));
            }
        }
        // 按照里面的数字进行排序
        sort(points.begin(), points.end(), [](Node& a, Node& b) {
            return a.val < b.val ? true : false;
        });
        // 到达当前下表i,j位置,最长路径长度
        std::vector<std::vector<int>> dp(m, std::vector<int>(n, 1));
        std::vector<std::vector<int>> direction{{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
        // 从小到大进行遍历,遍历到当前位置,比他小的数字的长度都已经求解完成了
        for (int i = 0; i < points.size(); ++i) {
            // 当前点的坐标
            int x = points[i].x;
            int y = points[i].y;
            for (int j = 0; j < direction.size(); ++j) {
                // 需要相减,求得前一个坐标
                int prev_x =  x - direction[j][0];
                int prev_y = y - direction[j][1];
                // 非法坐标 
                if (prev_x < 0 || prev_y < 0 || prev_x >= m || prev_y >= n) {
                    continue;
                }
                // 如果前一个坐标点数值,比当前点坐标大,过滤
                if (matrix[prev_x][prev_y] >= matrix[x][y]) {
                    continue;
                }
                // 更新最大路径
                dp[x][y] = max(dp[x][y], dp[prev_x][prev_y]+1);
            }
            
        }
        int result = 1;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                // 每一个位置都有可能是最长路径
                result = max(result, dp[i][j]);
            }
        }
        return result;
    }
};
// 九章算法强化班版本:
public class Solution {
    /**
     * @param matrix: A 2D-array of integers
     * @return: an integer
     */

    int[][] dp;
    int n, m;

    public int longestContinuousIncreasingSubsequence2(int[][] A) {
        if (A.length == 0) {
            return 0;
        }

        n = A.length;
        m = A[0].length;
        int ans = 0;
        dp = new int[n][m]; // dp[i][j] means the longest continuous increasing path from (i,j)
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                dp[i][j] = -1; // dp[i][j] has not been calculated yet
            }
        }

        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                search(i, j, A);
                ans = Math.max(ans, dp[i][j]);
            }
        }

        return ans;
    }

    int[] dx = { 1, -1, 0, 0 };
    int[] dy = { 0, 0, 1, -1 };

    void search(int x, int y, int[][] A) {
        if (dp[x][y] != -1) { // if dp[i][j] has been calculated, return directly
            return;
        }

        int nx, ny;
        dp[x][y] = 1;
        for (int i = 0; i < 4; ++i) {
            nx = x + dx[i];
            ny = y + dy[i];
            if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
                if (A[nx][ny] > A[x][y]) {
                    search(nx, ny, A); // dp[nx][ny] must be calcuted
                    dp[x][y] = Math.max(dp[x][y], dp[nx][ny] + 1);
                }
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DNDC模型四:土壤碳储量与作物产量、农田减排潜力分析

查看原文>>>双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用 由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会…

遥感影像处理-监督分类

遥感图像分类是图像信息提取的一种方法&#xff0c;是遥感数字图像处理的重要环节&#xff0c;也是遥感应用最广泛的领域之一&#xff0c;其中提取土地利用分类信息也是常见的应用领域。本推文简要介绍了图像分类的原理和方式&#xff0c;并着重介绍了最大似然分类法监督分类在…

分布式事务:XA和Seata的XA模式

大家好&#xff0c;我是方圆。上一篇博客《从2PC和容错共识算法讨论zookeeper中的Create请求》介绍了保证分布式事务提交的两阶段提交协议&#xff0c;而XA是针对两阶段提交提出的接口实现标准&#xff0c;本文则对XA进行介绍。 1. XA XA &#xff08;eXtended Architecture …

第一章 基础算法(三)—— 双指针,位运算,离散化与区间合并

文章目录 双指针位运算离散化区间合并双指针练习题799. 最长连续不重复子序列800. 数组元素的目标和2816. 判断子序列 位运算练习题801. 二进制中1的个数 离散化练习题802. 区间和 区间合并练习题803. 区间合并 为什么直接用y总的板书&#xff1f; 我是懒狗&#xff0c;不想再画…

音乐考级系统python+mysql

目录 废话不多说下面看严谨版不带web界面的&#xff1a; 总结&#xff1a; 写这个博客呢主要是因为之前学校有个简单的课设要做&#xff0c;想着白嫖一个交差的&#xff0c;但是找了一圈没找到合适的能拿来用的&#xff0c;我就下班用了两晚手搓了一个代码。 具体的建表语句…

PCB设计实验|第二周|谐波振荡电路实验|3月6日

目录 实验二 谐波振荡电路实验 一、实验原理 二、实验环境 三、实验结果及分析 四、实验总结 实验二 谐波振荡电路实验 一、实验原理 利用深度正反馈&#xff0c;通过阻容耦合使两个电子器件交替导通与截止&#xff0c;从而自激产生方波输出的振荡器&#xff0c;常用作…

ChatGPT在前,华为盘古Chat在后

国产盘古Chat对话方面堪比GPT-3.5 什么是ChatGPT&#xff1f;简单来说&#xff0c;就是一个能够和人类自然对话的人工智能系统。它可以理解你的语言&#xff0c;回答你的问题&#xff0c;甚至给你提供建议和服务。它不仅可以处理文字&#xff0c;还可以处理图片、视频、音频等…

基于Java学生信息管理系统-控制台版

基于Java学生信息管理系统-控制台版 一、系统介绍二、功能展示1.学生信息添加2.学生信息修改3.学生信息查询4.学生信息删除5.退出系统 三、代码展示四、其它1.其他系统实现2.获取源码 一、系统介绍 学生信息的添加、修改、删除、查询、退出系统 二、功能展示 1.学生信息添加…

【面试题01】抽象类、接口 的区别和使用场景

文章目录 一、抽象类和接口的区别1.1 定义方式不同1.2.成员方法不同1.3 实现方式不同1.4 构造方法不同1.5 访问修饰符不同1.6 关注点不同 二、抽象类和接口的使用场景2.1 抽象类的使用场景2.2 接口的使用场景 三、PHP代码演示总结 一、抽象类和接口的区别 抽象类和接口基本上是…

提升效率,使用ChatGPT的轻松撰写日报和周报

日报和周报是办公生活中不可或缺的部分&#xff0c;它们有助于记录工作进展、分享关键信息和与团队保持沟通。但是&#xff0c;有时写作这些报告可能会变得繁琐和耗时。在本文中&#xff0c;我们将介绍如何利用ChatGPT&#xff0c;一个强大的自然语言处理模型&#xff0c;提高写…

安卓开发级联显示菜单-省市区显示举例

安卓开发级联显示菜单-省市区显示举例 问题背景 安卓日常开发过程&#xff0c;经常会有需要级联显示的场景&#xff0c;比如省市区显示等&#xff0c;或者各种组织结构级联显示&#xff0c;本文将介绍安卓开发过程实现级联显示的一种方案。 实现效果如下&#xff1a; 问题分…

GaussDB整体性能慢分析

目录 问题描述问题现象告警业务影响原因分析分析步骤分析定位方法步骤一步骤二步骤三步骤四CPU满I/O满或者I/O异常内存满网络异常 步骤五并发问题数据库配置问题异常等待事件长时间性能下降短时性能抖动不优SQL 问题描述 整体性能慢。不满足客户作业对时延要求或者不满足客户预…

微信小程序 u-picker 三级联动 uView

微信小程序 u-picker 三级联动 uView 场景 移动端微信小程序框架 uView 中的 u-picker 实现三级联动 数据是一级一级加载的 [12,1201,120101] 多列联动 先了解属性参数 mode可以设置为&#xff1a;time、region、selector、multiSelector&#xff0c;区分时间、地区、单列&am…

2022高教社杯全国大学生数学建模竞赛B题解析(更新完结)

2022高教社杯全国大学生数学建模竞赛B题解析&#xff08;更新完结&#xff09; 题目解析前言问题一1.11.21.3问题二 题目 B 题 无人机遂行编队飞行中的纯方位无源定位 无人机集群在遂行编队飞行时&#xff0c;为避免外界干扰&#xff0c;应尽可能保持电磁静默&#xff0c;少向…

LC-LCP 41. 黑白翻转棋

LCP 41. 黑白翻转棋 难度中等32 在 n*m 大小的棋盘中&#xff0c;有黑白两种棋子&#xff0c;黑棋记作字母 "X", 白棋记作字母 "O"&#xff0c;空余位置记作 "."。当落下的棋子与其他相同颜色的棋子在行、列或对角线完全包围&#xff08;中间不…

Kotlin 一劳永逸实现 TAG

1 TAG 经典写法 对于 Android 开发&#xff0c;当我们需要在类中打印 Log 时&#xff0c;通常在Java中会这么定义一个 TAG&#xff1a; private static final String TAG "TestClass"; 或者不具体指定名字&#xff1a; private static final String TAG TestClass.…

Java粮油质量管控防伪溯源系统源码 粮油MES源码

Java粮油质量管控防伪溯源系统源码&#xff0c; 粮油MES源码&#xff0c;有演示&#xff0c;有源码。 一、全生命周期的追踪与溯源 &#xff08;1&#xff09;通过一物一码管理生产销售、追踪包装关联&#xff0c;配送管理及终端查询来实现窜货预警&#xff0c;及时处理问题&…

(一)rstudio容器用户配置root权限,安装conda

1、查看运行中的容器&#xff1a;docker ps 2、进入容器&#xff1a;docker exec -it my_rstudio /bin/bash 3、安装工具&#xff1a;apt-get install 4、查看权限配置文件&#xff1a;cat /etc/sudo 5、查看确认用户(rstudio)&#xff1a;cat /etc/passwd | cut -d: -f1 ro…

判断给定数据中是否存在True只要存在一个True结果为Turenp.sometrue()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断给定数据中是否存在True 只要存在一个True结果为Ture np.sometrue() 选择题 下列说法错误的是? import numpy as np a np.array([False, False, True]) print("【显示】a "…

三年时间打磨,MeterSphere v2.10 LTS版本给测试用户带来的价值

2023年5月&#xff0c;MeterSphere开源持续测试平台&#xff08;https://github.com/metersphere&#xff09;发布了v2.10 LTS版本。这是这个开源项目自2020年2月写下第一行代码后发布的第三个LTS版本。 在软件行业&#xff0c;LTS&#xff08;即Long Term Support&#xff09…