首页 > 其他分享 >力扣每日一题:LCR112--矩阵中的最长递增路径

力扣每日一题:LCR112--矩阵中的最长递增路径

时间:2024-04-04 12:58:39浏览次数:33  
标签:LCR112 matrix -- ++ 力扣 int && size newColumn

题目

给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。

示例 1:

输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出:4 
解释:最长递增路径为 [1, 2, 6, 9]

示例 2:

输入:matrix = [[3,4,5],[3,2,6],[2,2,1]]
输出:4 
解释:最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。

示例 3:

输入:matrix = [[1]]
输出:1

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 200
  • 0 <= matrix[i][j] <= 231 - 1

注意:本题与主站 329 题相同: . - 力扣(LeetCode)


请问您在哪类招聘中遇到此题?

1/5

社招

校招

实习

未遇到

通过次数

16.3K

提交次数

28.2K

通过率

57.6%

记忆化搜索

遍历所有的点[i][j],求出从[i][j]为起点时的递增路径长度,所有长度的最大值即为所求。正常搜索时会有很多重复操作,所以加上一个记忆化的数组f来记录从[i][j]出发的路径长度,初始化为0,在搜索[i][j]这个点时,如果f[i][j]非零,则直接返回f[i][j]的值。

class Solution {
public:
    int tx[4]={-1,1,0,0};
    int ty[4]={0,0,-1,1};
    int m;
    int n;
    int dfs(int x,int y,vector<vector<int>>& matrix,vector<vector<int>>& f)
    {
        if(f[x][y]!=0)
        {
            return f[x][y];
        }
        ++f[x][y];
        for(int i=0;i<4;i++)
        {
            int dx=x+tx[i];
            int dy=y+ty[i];
            if(dx>=0&&dx<m&&dy>=0&&dy<n&&matrix[dx][dy]>matrix[x][y])
            {
                f[x][y]=max(f[x][y],dfs(dx,dy,matrix,f)+1);
            }
        }
        return f[x][y];
    }
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        m=matrix.size();
        n=matrix[0].size();
        int maxLen=0;
        vector<vector<int>> f(m,vector<int>(n,0));
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                maxLen=max(maxLen,dfs(i,j,matrix,f));
            }
        }
        return maxLen;
    }
};

拓补排序

在一条上升路径中,必须先经过值小的点,才能再经过值大的点。也就是说在这个图中,值更小是值更大的先决条件,并且这个图中所有的路径是不可能构成环的。对于这种存在先决条件的无环有向图,可以用拓补排序来解决。

核心代码模式(官解)

class Solution {
public:
    static constexpr int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    int rows, columns;

    int longestIncreasingPath(vector< vector<int> > &matrix) {
        if (matrix.size() == 0 || matrix[0].size() == 0) {
            return 0;
        }
        rows = matrix.size();
        columns = matrix[0].size();
        auto outdegrees = vector< vector<int> > (rows, vector <int> (columns));
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < columns; ++j) {
                for (int k = 0; k < 4; ++k) {
                    int newRow = i + dirs[k][0], newColumn = j + dirs[k][1];
                    if (newRow >= 0 && newRow < rows && newColumn >= 0 && newColumn < columns && matrix[newRow][newColumn] > matrix[i][j]) {
                        ++outdegrees[i][j];
                    }
                }
            }
        }
        queue < pair<int, int> > q;
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < columns; ++j) {
                if (outdegrees[i][j] == 0) {
                    q.push({i, j});
                }
            }
        }
        int ans = 0;
        while (!q.empty()) {
            ++ans;
            int size = q.size();
            for (int i = 0; i < size; ++i) {
                auto cell = q.front(); q.pop();
                int row = cell.first, column = cell.second;
                for (int k = 0; k < 4; ++k) {
                    int newRow = row + dirs[k][0], newColumn = column + dirs[k][1];
                    if (newRow >= 0 && newRow < rows && newColumn >= 0 && newColumn < columns && matrix[newRow][newColumn] < matrix[row][column]) {
                        --outdegrees[newRow][newColumn];
                        if (outdegrees[newRow][newColumn] == 0) {
                            q.push({newRow, newColumn});
                        }
                    }
                }
            }
        }
        return ans;
    }
};

自己输入数据的模式

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<utility>
using namespace std;
int n,m;
int height[105][105];
int outdegrees[105][105];
int tx[]={-1,1,0,0};
int ty[]={0,0,-1,1};
int main()
{
    cin>>n>>m;
    queue<pair<int,int>> p;
    int maxLen=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>height[i][j];
            outdegrees[i][j]=0;
        }
    }
    //初始化出度,出度为0的入队
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            for(int k=0;k<4;k++)
            {
                int dx=i+tx[k];
                int dy=j+ty[k];
                if(dx>=0&&dx<n&&dy>=0&&dy<m&&height[dx][dy]>height[i][j])
                    ++outdegrees[i][j];
            }
            if(outdegrees[i][j]==0)
                p.push({i,j});
        }
    }
    //开始拓补排序,类似于广度优先
    while(!p.empty())
    {
        ++maxLen;
        int size=p.size();
        for(int i=0;i<size;i++)
        {
            pair<int,int> cur=p.front();
            p.pop();
            int x=cur.first,y=cur.second;
            //更新相邻节点的出度为0的出度
            for(int k=0;k<4;k++)
            {
                int dx=x+tx[k];
                int dy=y+ty[k];
                if(dx>=0&&dx<n&&dy>=0&&dy<n&&height[dx][dy]<height[x][y])
                {
                    --outdegrees[dx][dy];
                    if(outdegrees[dx][dy]==0)
                    {
                        p.push({dx,dy});
                    }
                }
            }
        }
    }
    cout<<maxLen;
}

标签:LCR112,matrix,--,++,力扣,int,&&,size,newColumn
From: https://blog.csdn.net/m0_73441691/article/details/137370274

相关文章

  • “梦该醒了,少年”
    顺序表1、数据结构相关概念2、顺序表2.1、顺序表的概念及结构2.2、顺序表分类2.3、动态顺序表的实现3、ps:源码1、数据结构相关概念数据结构是由“数据”和“结构”两词组合⽽来。什么是数据?常⻅的数值1、2、3、4…、教务系统⾥保存的⽤⼾信息(姓名、性别、年龄、......
  • 【数据库】主流数据库及其常用工具简单科普
    主流数据库及其常用工具数据库分类关系型数据库(RDBMS)非关系型数据库(NoSQL)混合型数据库(HybridDatabases)对象关系数据库(ORDBMS)多维数据库(MultidimensionalDatabase)内存数据库(In-MemoryDatabase)主流数据库及其常用工具OracleMySQLMicrosoftSQLServerPostgreSQLMongoDB......
  • 代码随想录算法训练营第一天 | 数组 704.二分查找 27.移除元素
    leetcode704.二分查找题目704.二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。解题思路代码实现本题对自己的难点有大概的解题思路,但是代码实现有几个点写不出来1、怎么取......
  • Docker 知识汇总
    Docker知识汇总docker学习docker概述docker安装docker命令镜像命令容器命令操作命令dockers镜像容器数据卷dockerfile编写dockerfile构建文件,命令大写(源代码)#docker指令FROM#基础镜像,一切从这里开始MAINTAINER#镜......
  • sql注入之--堆叠注入
    sql注入之--堆叠注入转自:https://blog.csdn.net/Jayjay___/article/details/132081414什么是堆叠注入?用简单通俗的话来解释就是多条命令一起执行,比如在MySQL中我们知道在输入一个命令之后要用;表示一个指令的输入完成,那么我们就想是否可以在一句指令之后再加上一句指令,就比如 ......
  • P4391 [BOI2009] Radio Transmission 无线传输
    原题链接题解1.当\(s_2\)长度大于等于\(s_1\)时,我们就令\(s2\)的长度为\(n\)2.当\(len(s_2)<n\)时,我们令此时的\(s_2\)无法被自我链接形成,为什么要这么设?3.此时的\(s_1\)与\(s_2\)的关系一定张这样,为什么\(s_2\)一定开头重合?因为我们可以把不重合的后半部......
  • ctfshow--web10
    dirsearch没有扫到文件查看源代码发现有个style.css文件点击查看查看index.phps代码又是代码审计点击查看代码<?php $flag="";functionreplaceSpecialChar($strParam){$regex="/(select|from|where|join|sleep|and|\s|union|,)/i";......
  • 2024.4 第一周做题记录
    \(2024.4.2\)CF1336DYuiandMahjongSet题意:初始有一个值域在\([1,n]\)的多重整数集\(S\),且每个元素重复次数最多为\(n\),定义\(\operatorname{triple}(S)\)表示\(S\)中相同无序三元组数量,\(\operatorname{straight}(S)\)表示\(S\)中连续整数的无序三元组数量,告诉......
  • 第五篇:3.4 用户归因和受众(User attribution and audience) - IAB/MRC及《增强现实广告
    翻译计划第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之-3.1广告印象(ADImpression)第三篇广告效果测量定义和其他矩阵之-3.2可见性(Viewability)第四篇广告效果测量定义和其他矩阵之-3.3无效流量(Invali......
  • 机械识别技术在懂车帝SEO排名代发中的应用与优势
    机械识别技术在懂车帝SEO排名代发中的应用与优势机械行业在懂车帝如何做SEO布局#seo优化seo排名关键词排名#干货分享#短视频运营欢迎大家来到百收网SEO课堂,我是狂潮老师,那么我们第三节课讲的是网页,必须符合机械识别啊。那么在这里再次提醒一下,如果同学们你们的基础不好,那......