【剑指 Offer】矩阵中的路径

矢量网络分析仪VNA的校准之SOLT方法 作者:杭州冥鸿电子科技有限公司 邮箱:huanglong@deepelec.com S参数的测量方法有两种,一种是基于扫频测量的原理(VNA),另外一种是基于快沿阶跃响应的原理(TDR)。 下图是VNA的原理框图,主要包括以下部分: (1)激励信号源:提供感兴趣的频率范围内的入射信号; (2)信号分离装置:含功分器和定向耦合器,分离出入射,反射和传输信号; (3)接收机:... 阅读详情

题目描述

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

题目链接:https://leetcode.cn/problems/ju-zhen-zhong-de-lu-jing-lcof/

解答

递归

自己想的递归方法,想节省空间用字符串记录访问路径,后来发现还不如用数组,不过也算自己独立完成的,笨是笨了些,好在大体思路正确。
时间:2354 ms,内存:41.9 MB。

class Solution {
    public boolean exist(char[][] board, String word) {
        int row = board.length;
        int col = board[0].length;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (checkWord(board, word, 0, "", i, j) == true) return true;
            }
        }
        return false;
    }

    public boolean checkWord (char[][] board, String word, int charIndex, String path, int rowIndex, int colIndex) {
        if (charIndex == word.length()) return true;
        if (rowIndex < 0 || rowIndex >= board.length || colIndex < 0 || colIndex >= board[0].length) return false;
        if (path.indexOf(""+rowIndex+colIndex) > -1) return false;

        if (board[rowIndex][colIndex] == word.charAt(charIndex)) {
            path = path + rowIndex + colIndex + " ";
            return checkWord(board, word, charIndex+1, path, rowIndex-1, colIndex)
                || checkWord(board, word, charIndex+1, path, rowIndex+1, colIndex)
                || checkWord(board, word, charIndex+1, path, rowIndex, colIndex-1)
                || checkWord(board, word, charIndex+1, path, rowIndex, colIndex+1);
        } else {
            return false;
        }
    }
}

回溯

参考官方思路修改了代码,重点是使用访问数组记录已经访问的元素,遍历失败时回溯到上个节点寻找其他路径,并恢复访问数组元素。
时间:168 ms,内存:41.7 MB。

class Solution {
    public boolean exist(char[][] board, String word) {
        int row = board.length, col = board[0].length;
        boolean[][] visited = new boolean[row][col];
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (checkWord(board, word, visited, i, j, 0)) return true;
            }
        }
        return false;
    }

    public boolean checkWord (char[][] board, String word, boolean[][] visited, int rowIndex, int colIndex, int wordIndex) {
        if (board[rowIndex][colIndex] != word.charAt(wordIndex)){
            return false;
        } else if (wordIndex == word.length()-1) {
            return true;
        }

        visited[rowIndex][colIndex] = true;
        int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        for (int[] dir : directions) {
            int newRow = rowIndex + dir[0];
            int newCol = colIndex + dir[1];
            if (newRow >= 0 && newRow < board.length && newCol >= 0 && newCol < board[0].length) {
                if (!visited[newRow][newCol]) {
                    if (checkWord(board, word, visited, newRow, newCol, wordIndex+1)) return true;
                }
            }
        }
        visited[rowIndex][colIndex] = false;
        return false;
    }
}

回溯(优化?)

除了开辟新数组用于存放访问元素,也可以直接在原数组上进行修改,将访问过的元素改为空白字符,不过这种方法感觉不是很规范。
时间:166 ms,内存:41.7 MB。

class Solution {
    public boolean exist(char[][] board, String word) {
        int row = board.length, col = board[0].length;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (checkWord(board, word, i, j, 0)) return true;
            }
        }
        return false;
    }

    public boolean checkWord (char[][] board, String word, int rowIndex, int colIndex, int wordIndex) {
        if (board[rowIndex][colIndex] != word.charAt(wordIndex)){
            return false;
        } else if (wordIndex == word.length()-1) {
            return true;
        }

        board[rowIndex][colIndex] = ' ';
        int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        for (int[] dir : directions) {
            int newRow = rowIndex + dir[0];
            int newCol = colIndex + dir[1];
            if (newRow >= 0 && newRow < board.length && newCol >= 0 && newCol < board[0].length) {
                if (checkWord(board, word, newRow, newCol, wordIndex+1)) return true;
            }
        }
        board[rowIndex][colIndex] = word.charAt(wordIndex);
        return false;
    }
}

回溯(时间优化)

其实思路大多数是一致的,代码细节上不一样,结果区别也挺大。
时间:87 ms,内存:39.5 MB。

class Solution {
    public boolean exist(char[][] board, String word) {
        int row = board.length, col = board[0].length;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (checkWord(board, word, i, j, 0)) return true;
            }
        }
        return false;
    }

    public boolean checkWord (char[][] board, String word, int rowIndex, int colIndex, int wordIndex) {
        if (wordIndex == word.length()) return true;
        if (rowIndex < 0 || rowIndex == board.length || colIndex < 0 || colIndex == board[0].length || board[rowIndex][colIndex] != word.charAt(wordIndex)) return false;

        board[rowIndex][colIndex] = ' ';
        boolean res = checkWord(board, word, rowIndex+1, colIndex, wordIndex+1)
            || checkWord(board, word, rowIndex-1, colIndex, wordIndex+1)
            || checkWord(board, word, rowIndex, colIndex+1, wordIndex+1)
            || checkWord(board, word, rowIndex, colIndex-1, wordIndex+1);
        board[rowIndex][colIndex] = word.charAt(wordIndex);
        return res;
    }
}
Windows下MMdetection3D保姆级安装指南(含CUDA和PyTorch版本避坑) 本文提供Windows平台下MMdetection3D的完整安装指南,重点解决CUDA与PyTorch版本匹配问题。从环境准备到关键组件安装,详细介绍了CUDA Toolkit选择策略、PyTorch精准安装步骤,以及MM系列组件的安装顺序和常见错误解决方案,帮助用户顺利完成3D目标检测环境的配置。 阅读详情

相关推荐

基于人脸识别的驾驶员疲劳检测方法研究

摘 要交通安全问题愈发严重,疲劳驾驶已是造成交通事故的主要因素之一。为减少因疲劳驾驶造成的交通事故,本文设计了一种基于图像处理技术的疲劳驾驶监测系统,该系统结合了肤色模型、灰度积分投影技术以及PERCLOS方法,旨在通过实时视频图像分析准确检测驾驶员的疲劳状态。首先,系统通过肤色模型从图像中有效提取人脸区域,并在此基础上利用Haar级联分类器进行人脸检测,确保在人脸角度变化或部分遮挡的情况下依然能够实现高效识别。接着,灰度积分投影技术被应用于眼部定位,通过分析眼睛区域的灰度变化,精确确定眼睛的上下边界,从

carrott0617的博客 1005

剑指Offer12-矩阵中的路径

剑指Offer典型题整理 - 争取做最好的题解 剑指Offer12-矩阵中的路径 整理时间:2020年02月18日 本题和 LeetCode-79 相同 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的...

哆啦A瑶的博客 597

NVIDIA 2025 Board Design Engineer 校招笔试

电路分析,矩形波阶跃反馈驱动​,误差信号。非常简单,数电or​离散基础。第一题是考试规矩知情确认。大二暑假做的,纯体验​。五六题太长,下篇分享。

m0_74253823的博客 1124

剑指offer题解(矩阵中的路径)

剑指offer题解(矩阵中的路径): 题目组链接:https://www.nowcoder.com/ta/coding-interviews 本题知识点:dfs,回溯。 思路:深度遍历,设置一个与矩阵同等大小的布尔数组,用来存储矩阵中对应的坐标元素的访问情况。每一个节点都当做遍历的入口,当有一个字符匹配成功之后,先flag标记数组中的下标位置为true,接着继续遍历当前坐标的上、下、左、右四个方向(保证若坐标对应的的flag为false才能够继续访问,否则视为已经访问过。不可重复访问,否则就会无限循环),判

lk990908的博客 216

C++结合大漠插件实现DNF自动化脚本:从原理到实战

自动化技术通过模拟用户操作,实现重复性任务的自动执行,其核心原理在于对系统输入输出接口的精确控制。在Windows平台,这通常涉及窗口管理、图像识别与键鼠模拟等技术。这些技术为软件自动化测试、办公流程自动化及特定场景的辅助工具开发提供了工程实践基础。大漠插件作为国内广泛使用的Windows自动化开发组件,封装了上述底层操作,显著降低了开发门槛。通过其提供的COM接口,开发者可以高效实现窗口绑定、后台找图找色及内存读写等关键功能。本文以《地下城与勇士》为例,详细解析如何利用C++集成大漠插件,构建一个稳定、高

weixin_34185512的博客 567

机器学习中正则化项L1和L2的直观理解

正则化(Regularization) 机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作ℓ1ℓ1\ell_1-norm和ℓ2ℓ2\ell_2-norm,中文称作L1正则化和L2正则化,或者L1范数和L2范数。 L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用L1正则化的模型建叫做...

小平子的专栏 43万+

剑指 Offer 12. 矩阵中的路径

最近做了一个剑指offer上的 剑指 Offer 12. 矩阵中的路径 这道题用了dfs和回溯算法,挺有典型意义的,在这里,列举一个,分析分析,加强记忆。 题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。 [["a","b","c","e"], ["

蓝猫爱睡觉 279

yolov26改进 | 检测头篇 | 利用渐近特征金字塔网络AFPN改进yolov26检测头融合P2网络结构(让小目标无所遁形,全网独家首发)

本文介绍一种基于AFPN渐近特征金字塔网络改进的YOLOv26四检测头Detect_FPN。AFPN通过逐级融合底层细节、中层结构与高层语义特征,缩小不同尺度特征之间的语义差距,减少直接融合带来的信息冲突,使检测头获得更稳定、更充分的多尺度表达。本文进一步增加高分辨率小目标检测分支,强化对微小目标、密集目标和复杂背景目标的感知能力,适合工业缺陷、遥感及无人机等场景。文中将展示基础模型与改进模型的训练对比结果,并提供完整代码、配置文件、模块注册方法及Codex修改思路,方便直接复现和二次创新。

Snu77的博客 367

剑指offer(C++)——矩阵中的路径

题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如[a b c e s f c s a d e e]是3*4矩阵,其包含字符串"bcced"的路径,但是矩阵中不包含“abcb”路径,因为字符串的第一

YF_Li123的博客 2588

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1650

基于STM32设计的智能水产养殖系统(华为云IOT)(152)

当前设计的智能水产养殖系统主控芯片采用STM32F103RCT6,可以实现对水位、水温、水混浊度和PH值等参数的监测和控制,并且支持定时投喂功能。通过连接华为云物联网平台,将传感器数据上传到服务器,并通过Qt设计的Android手机APP来获取设备上传的数据,从而实现对养殖环境的远程监测和控制。

8825

剑指Offer 面试题12. 矩阵中的路径

剑指Offer 面试题12. 矩阵中的路径 解题思路: 利用DFS加回溯的思路,寻找所有可能的路径。分别向上、左、下、右四个方向寻找,如果有一个方向走得通,则返回true,如果都走不通,说明当前元素无法形成路径,要进行回溯。 源代码: class Solution { private: int len; bool vis[1000][1000] = {false}; public: bool helper(vector<vector<char>>&amp

chizhonghang的博客 254

车载以太网网络测试-24【SOME/IP概述】

SOME/IP**(Scalable Service-Oriented Middleware over IP)是一种基于IP网络的面向服务的通信协议,专为汽车电子系统设计,支持服务发现、远程过程调用(RPC)和事件通知等功能。核心标准是由 AUTOSAR(汽车开放系统架构)定义,现已成为车载通信的重要标准之一(如AUTOSAR 4.0+)。SOME/IP的全称是,它是一种基于IP网络的面向服务的通信协议,广泛应用于汽车电子(AUTOSAR)和物联网领域。Scalable(可扩展的)含义。

车载网络测试工程师的博客 2186

剑指 Offer 12. 矩阵中的路径 python

剑指 Offer 12. 矩阵中的路径 python 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。 [[“a”,“b”,“c”,“e”], [“s”,“f”,“c”,“s”], [“a”,“d”,“e”,“e”]] 但矩阵中不包含字符串“abfb”的路径

qq_1277054161 483

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

剑指offer第65题:矩阵中的路径

剑指offer第65题:矩阵中的路径题目描述矩阵中的路径源码 题目描述 矩阵中的路径 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcc...

可爱的小腊肉 278

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

剑指offer 矩阵中的路径

剑指offer题型分类及各题的解题思路与代码(<---点我跳转 ^ - ^) 1、题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩...

请叫我皮皮虾的博客 208

剑指offer 12.矩阵中的路径

剑指offer 12.矩阵中的路径 解题思路: 回溯法,创建一个boolean[] 数组,记录每个字符是否被使用过,从上下左右四个方向递归搜索,如果下一个字符符合提哦案件,继续递归,如果不符合,让当前字符标记为没有使用。 public static void main(String[] args) { char[] matrix={'A','B','C','E','S','...

厚积薄发的博客 632

剑指offer:矩阵中的路径、机器人的运动范围

剑指offer:矩阵中的路径、机器人的运动范围 题目: 矩阵中的路径: 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符路径。路径可以从矩阵的任一格开始,每一步可以在矩阵中向左右上下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。 思路: 深度优先搜索。 实现: class Solution { public: bool hasP...

starflyyy的博客 218

17. leetCode--剑指Offer12矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。

weixin_45267102的博客 221

剑指Offer 矩阵中的路径

剑指Offer 矩阵中的路径 题目描述: 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个...

张毅的博客 426

剑指offer(第二版)——矩阵中的路径

PS:《剑指offer》是很多同学找工作都会参考的一本面试指南,同时也是一本算法指南(为什么它这么受欢迎,主要应该是其提供了一个循序渐进的优化解法,这点我觉得十分友好)。现在很多互联网的算法面试题基本上可以在这里找到影子,为了以后方便参考与回顾,现将书中例题用Java实现(第二版),欢迎各位同学一起交流进步。 GitHub: https://github.com/Uplpw/SwordOffer。 完整题目链接: https://blog.youkuaiyun.com/qq_41866626/article/detai

qq_41866626的博客 288

剑指offer之矩阵中的路径

剑指offer之矩阵中的路径 题目描述解题思路Code 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,...

gq__97的博客 320

剑指 Offer 12. 矩阵中的路径 java dfs

题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。 [[“a”,“b”,“c”,“e”], [“s”,“f”,“c”,“s”], [“a”,“d”,“e”,“e”]] 但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一

木竹的博客 166
上一篇: 【剑指 Offer】旋转数组的最小数字
下一篇: 【Head First Java 笔记】Java回收机制
includei
博客等级 码龄9年 406粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值