首页 > 其他分享 >记忆化搜索 —— Leetcode 2684. 矩阵中移动的最大次数

记忆化搜索 —— Leetcode 2684. 矩阵中移动的最大次数

时间:2024-03-21 19:33:22浏览次数:27  
标签:int 单元格 矩阵 vector grid 2684 true Leetcode

题目如下:

给你一个下标从 0 开始、大小为 m x n 的矩阵 grid ,矩阵由若干  整数组成。

你可以从矩阵第一列中的 任一 单元格出发,按以下方式遍历 grid :

  • 从单元格 (row, col) 可以移动到 (row - 1, col + 1)(row, col + 1) 和 (row + 1, col + 1) 三个单元格中任一满足值 严格 大于当前单元格的单元格。

返回你在矩阵中能够 移动 的 最大 次数。

思路:按列层次搜索,设正在检索第k列,如果列内检测到一个从k-1列能走到的格子,那么去判断该格能走到k+1列的哪些元素,并标记这些可到达的格子。利用布尔矩阵去记录对应的原矩阵的格子是否能到达。如果第k列的所有格子都不能走到k+1列的所有格子,就停止搜索。

#include<bits/stdc++.h>
using namespace std;

class Solution {
public:
    int bfs(vector<vector<int>>& grid,vector<vector<bool>>& boolmap){
        int m = grid.size();//行
        int n = grid[0].size();//列
        int x = 0;
        bool go = true;
        while(x<n && go){
            go = false;
            for(int i=0;i<m;i++){
                if(boolmap[i][x]){
                    if(x+1<n && grid[i][x+1] > grid[i][x]){
                        boolmap[i][x+1]=true;
                        go = true;
                    }
                    if(x+1<n && i-1>=0 && grid[i-1][x+1] > grid[i][x]){
                        boolmap[i-1][x+1]=true;
                        go = true;
                    }
                    if(x+1<n && i+1<m && grid[i+1][x+1] > grid[i][x]){
                        boolmap[i+1][x+1]=true;
                        go = true;
                    }
                }
            }
            x++;
        }
        return x-1;
    }

    int maxMoves(vector<vector<int>>& grid) {
        int m = grid.size();
        int n = grid[0].size();
        vector<vector<bool>> boolmap(m,vector<bool>(n,false));
        for(int i=0;i<m;i++){
            boolmap[i][0] = true;
        }
        return bfs(grid,boolmap);
    }
};

记得初始化第一列都是可到达的格子,因为它们是起点。

感谢你能看到这里。

标签:int,单元格,矩阵,vector,grid,2684,true,Leetcode
From: https://blog.csdn.net/q1557137513/article/details/136770747

相关文章

  • MATLAB学习笔记6:矩阵的操作1
    说了三篇各种矩阵的创建,终于进行到下一部分了,太不容易了,今天我们来说说矩阵的操作,说白了就是对矩阵进行一些我们平时计算需要在纸上操作的步骤,用软件肯定要方便得多1.矩阵的拼接这个还是很好理解嘛,比如两个3*3的矩阵就可以横着或者竖着拼接到一起,而4*5与4*6的矩阵就只能横着......
  • LeetCode-滑动窗口最大值
    """题目来源https://leetcode.cn/problems/sliding-window-maximum/"""fromcollectionsimportdequeclassSolution(object):defmaxSlidingWindow(self,nums,k):#记录所有区间长度为k的最大值ans=[]#单调递减队列,从队首......
  • 代码随想录算法训练营day29 | leetcode 491. 非递减子序列、46. 全排列、47. 全排列 I
    目录题目链接:491.非递减子序列-中等题目链接:46.全排列-中等题目链接:47.全排列II-中等题目链接:491.非递减子序列-中等题目描述:给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重......
  • LeetCode 2265. Count Nodes Equal to Average of Subtree
    原题链接在这里:https://leetcode.com/problems/count-nodes-equal-to-average-of-subtree/description/题目:Giventhe root ofabinarytree,return thenumberofnodeswherethevalueofthenodeisequaltothe average ofthevaluesinits subtree.Note:Th......
  • NumPy的矩阵运算
    #作者:小恒不会java#时间:2024年3月1日#微信:a13551458597importnumpyasnp#创建一个2x3的矩阵AA=np.array([[1,2,3],[4,7,9]])#获取矩阵A的形状shape_A=A.shape#对矩阵A进行转置运算得到矩阵BB=A.T#使用numpy的matmul函数进行矩阵乘法运算(注意......
  • 2024-03-20 leetcode写题记录
    目录2024-03-20leetcode写题记录23.合并K个升序链表题目链接题意解法4.寻找两个正序数组的中位数题目链接题意解法25.K个一组翻转链表题目链接题意解法2024-03-20leetcode写题记录23.合并K个升序链表题目链接23.合并K个升序链表题意给你一个链表数组,每个链表......
  • 2024-03-19 leetcode写题记录
    目录2024-03-19leetcode写题记录85.最大矩形题目链接题意解法2024-03-19leetcode写题记录85.最大矩形题目链接85.最大矩形题意给定一个仅包含0和1、大小为rowsxcols的二维二进制矩阵,找出只包含1的最大矩形,并返回其面积。解法先对每个元素求出其往上能延伸......
  • LeetCode刷题记录——day2
    https://leetcode.cn/problems/product-of-array-except-self/description/?envType=study-plan-v2&envId=top-interview-150问题在于不使用除法并且空间复杂度为O(1),当第一次从头开始遍历时由于不知道后续数组元素是什么,所以无法得到答案,而如果当知道一个后续数组元素后,又回去更......
  • leetcode代码记录(长度最小的子数组
    目录1.题目:2.我的代码:小结:1.题目:给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的连续子数组[numsl,numsl+1,…,numsr-1,numsr],并返回其长度。如果不存在符合条件的子数组,返回0。示例1:输......
  • NOJ南邮上机 矩阵变换问题 PROB1020 Python
    PROB1020   矩阵变换问题描述:给定一个 n×m的矩阵,对于 初始矩阵 中所有值为 1 的元素,重置其 所在行列 的所有元素为 0,最后输出整个修改后的矩阵。输入:输入共包含 1+n行。第一行包两个整数 n 和 m,分别表示矩阵的长和宽,题目保证 2≤n,m≤700且 4≤n×m......