力扣 剑指 Offer 12. 矩阵中的路径

超时代码
dfs返回值是void,用类内的全局变量flag表示找到或没找到。

class Solution {
public:
bool flag;
int vis[210][210];
int dir[4][2] = { {1,0},{0,1},{-1,0},{0,-1} };
int m, n;
void dfs(int x, int y, int count, string& word, vector<vector<char>>& board) {
if (board[x][y] != word[count]) {
return;
}
if (count == word.size() - 1) {
flag = true;
return;
}
for (int i = 0; i < 4; i++) {
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if (nx >= 0 && nx <= m - 1 && ny >= 0 && ny <= n - 1 && vis[nx][ny] == 0) {
vis[nx][ny] = 1;
dfs(nx, ny, count + 1, word, board);
vis[nx][ny] = 0;
}
}
} bool exist(vector<vector<char>>& board, string word) {
m = board.size();
n = board[0].size();
int sn = word.size();
flag = false;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
memset(vis, 0, sizeof(vis));
vis[i][j] = 1;
dfs(i, j, 0, word, board);
vis[i][j] = 0;
if (flag) break;
}
}
return flag;
}
};

通过代码
将dfs返回值改为bool类型就通过了。分析原因可能是找到一条满足的路径后立即返回,如果没有返回值,还要将整个dfs执行完才能结束,可能递归调用和栈的一些操作浪费了一些时间(这从时间复杂度角度不好分析)

class Solution {
public:
bool flag;
int vis[210][210];
int dir[4][2] = { {1,0},{0,1},{-1,0},{0,-1} };
int m, n;
bool dfs(int x, int y, int count, string& word, vector<vector<char>>& board) {
if (board[x][y] != word[count]) {
return false;
}
if (count == word.size() - 1) {
flag = true;
return true;
}
for (int i = 0; i < 4; i++) {
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if (nx >= 0 && nx <= m - 1 && ny >= 0 && ny <= n - 1 && vis[nx][ny] == 0) {
vis[nx][ny] = 1;
if (dfs(nx, ny, count + 1, word, board)) return true;
vis[nx][ny] = 0;
}
}
return false;
} bool exist(vector<vector<char>>& board, string word) {
m = board.size();
n = board[0].size();
flag = false;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
memset(vis, 0, sizeof(vis));
vis[i][j] = 1;
if (dfs(i, j, 0, word, board)) return true;
vis[i][j] = 0;
if (flag) return true;
}
}
return false;
}
};

dfs 返回值用bool相对void会快一点的更多相关文章

  1. C# 调用 C++ 的 DLL 返回值为 bool 时,值混乱

    现象:C++ 导出函数的返回值为 false,C# 调用该函数获取的返回值却为 true . 原因:C++ 导出函数返回 false 时,采取的方式是: 将 C# 定义的用来接收返回值的 bool 所 ...

  2. malloc 返回值的类型是 void *

    malloc 返回值的类型是 void *,所以在调用 malloc 时要显式地进行类型转换,将 void * 转换成所需要的指针类型. #include <iostream> using ...

  3. jQuery find() 搜索所有段落中的后代 C# find() 第一个匹配元素 Func 有返回值 Action是没有返回值 Predicate 只有一个参数且返回值为bool 表达式树Expression

    所有p后代span Id为 TotalProject 的 select 标签 的后代 option标签 为选中的 text using System; using System.Collections ...

  4. std::vector<bool> 在 auto 推断下的返回值是 bool & 引用

    转自: https://www.cnblogs.com/hustxujinkang/p/5218148.html //////////// std::vector<bool> featur ...

  5. void in javascript是一个指定要计算表达式但不返回值的运算符

    void in javascript是一个指定要计算表达式但不返回值的运算符.void运算符使用格式如下:1.javascript:void(表达式)2.javascript:void表达式表达式是要 ...

  6. 关于"cin>>"输入成功或失败时的“返回值”(转载)

    今天在看c++primer的时候,读到其中这样一段话: When we use an istream as a condition, the effect is to test the state o ...

  7. iOS用三种途径实现一方法有多个返回值

    以前觉得这种标题有点偏向于理论,实际开发中怎么会有这种诡异的需求,但是真正遇到了这种硬需求时觉得还是有那么点价值的,理论付诸了实践在此也就做了个整理. 以我私下开发中的一处代码为例,本意是希望有这么一 ...

  8. 学习笔记_springmvc返回值、数据写到页面、表单提交、ajax、重定向

    数据写到页面 后台往前台传数据 TestController添加 /** * 方法的返回值采用ModelAndView, new ModelAndView("index", map ...

  9. 慕课网-Java入门第一季-7-2 Java 中无参无返回值方法的使用

    来源:http://www.imooc.com/code/1578 如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法. 方法的使用分两步: 第一步,定义方法 例如:下面代码定义了一个方法名 ...

  10. springmvc返回值、数据写到页面、表单提交、ajax、重定向

    实验是在前一篇文章的项目上做的: 数据写到页面 后台往前台传数据 TestController添加 /** * 方法的返回值采用ModelAndView, new ModelAndView(" ...

随机推荐

  1. sql面试50题------(11-20)

    文章目录 11.查询至少有一门课与学号为'01'的学生所学课程相同的学生的学号和姓名 12.查询和'01'号同学所学课程完全相同的其他同学的学号 13.查询两门及其以上不及格课程的同学的学号,姓名及其 ...

  2. HTML基础知识(3)浮动、塌陷问题

    1.浮动 1.1 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...

  3. python基础之标识符、注释与变量

    一.注释 1.作用:注释是用来解释和说明代码的. 2.分类:注释可以分为单行注释和多行注释 2.1.单行注释:在编写的代码或文字前加上"#",表示单行注释 1 #我是单行注释 2 ...

  4. Python基础之函数:1、函数的介绍及名称空间

    目录 一.函数 1.什么是函数 2.函数的语法结构 3.函数的定义与调用 4.函数的分类 5.函数的返回值 6.函数的参数 二.函数参数 1.位置参数 2.默认参数 3.可变长参数 1.一个*号 2. ...

  5. 接入监控视频,为啥还需要对接厂商的SDK呢,不是有onvif这样的标准协议吗?

    不少人问过我这个问题,这真是一个好问题. 我举两个例子,让您仔细品: ① 快速打开视频和极致操控的问题. onvif协议很科班,但厂商的sdk可能会给你一些独特的方法,譬如先make一个I帧,这样第一 ...

  6. Redis管理及监控工具推荐

    推荐一款Redis管理软件.[官网 http://www.redisant.cn/] 功能描述: 1. 键和字段CRUD和glob. 2. 适用于字符串.列表.散列.集合.有序集合. 通过漂亮的用户界 ...

  7. 嵌入式-C语言基础:函数指针

    定义函数地址:如果在程序中定义了一个函数,那么在编译的时候,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址(也叫入口地址)称为这个函数的地址. 和数组一样,数组名代表地址,而函数名表示函数 ...

  8. CopyOnWriteArrayList 是如何保证线程安全的?

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 前言 大家好,我是小彭. 在上一篇文章里,我们聊到了ArrayList 的线程安全问题,其中提到了 Copy ...

  9. C温故补缺(八):结构体与共用体

    结构体与共用体 结构体 是一个可以存储多个不同类型的变量的结构,类似于面对对象中的类(只有成员变量的类). struct tag { member-list member-list member-li ...

  10. Microsoft.IO.RecyclableMemoryStream源码解读

    一.RecyclableMemoryStreamManager 源码地址:https://github.com/Microsoft/Microsoft.IO.RecyclableMemoryStrea ...