【java刷算法】牛客—剑指offer4DFS与BFS两种思路的碰撞,一起来练习吧

总结:心得体会

既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。

学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。

面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。

最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。

大厂Java架构核心笔记(适合中高级程序员阅读):

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • ✨今日二剑

      • JZ12 矩阵中的路径

      • JZ13 机器人的运动范围

  • JZ12 矩阵中的路径

    • 题目描述

    • 思路详解

    • 代码与结果

  • JZ13 机器人的运动范围

    • 题目描述

    • 思路详解

      • DFS(深度优先搜索)

      • BFS(广度优先搜索)

    • 代码与结果

      • DFS(深度优先搜索)

      • BFS(广度优先搜索)

  • ✨总结


JZ12 矩阵中的路径

===========================================================================

题目描述


在这里插入图片描述

思路详解


本题我们用回溯算法解决。

我们看到他是从矩形中的一个点开始往他的上下左右四个方向查找,这个点可以是矩形中的任何一个点,就是遍历矩形所有的点,然后从这个点开始往他的4个方向走,因为是二维数组,所以有两个for循环。

我们接下来写一个 dfs 方法,对其控制判断和方向的转变。

详细见注释哦!!!

代码与结果



import java.util.*;



public class Solution {

    /**

     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可

     *

     * 

     * @param matrix char字符型二维数组 

     * @param word string字符串 

     * @return bool布尔型

     */

   public boolean hasPath(char[][] matrix, String word) {

    char[] words = word.toCharArray();

    for (int i = 0; i < matrix.length; i++) {

        for (int j = 0; j < matrix[0].length; j++) {

            //从[i,j]这个坐标开始查找

            if (dfs(matrix, words, i, j, 0))

                return true;

        }

    }

    return false;

}

 

boolean dfs(char[][] matrix, char[] word, int i, int j, int index) {

    //边界的判断,如果越界直接返回false。index表示的是查找到字符串word的第几个字符,

    //如果这个字符不等于matrix[i][j],说明验证这个坐标路径是走不通的,直接返回false

    if (i >= matrix.length || i < 0 || j >= matrix[0].length || j < 0 || matrix[i][j] != word[index])

        return false;

    //如果word的每个字符都查找完了,直接返回true

    if (index == word.length - 1)

        return true;

    //把当前坐标的值保存下来,为了在最后复原

    char tmp = matrix[i][j];

    //然后修改当前坐标的值

    matrix[i][j] = '.';

    //走递归,沿着当前坐标的上下左右4个方向查找

    boolean res = dfs(matrix, word, i + 1, j, index + 1)

            || dfs(matrix, word, i - 1, j, index + 1)

            || dfs(matrix, word, i, j + 1, index + 1)

            || dfs(matrix, word, i, j - 1, index + 1);

    //递归之后再把当前的坐标复原

    matrix[i][j] = tmp;

    return res;

}

}



在这里插入图片描述

JZ13 机器人的运动范围

=============================================================================

题目描述


在这里插入图片描述

在这里插入图片描述

思路详解


本题是一个机器人从左上角开始,他可以沿着上下左右四个方向走,并且走到的每个格子坐标的数字和不大于k,问可以走多少个格子。那么就想到本题就有两种解法,DFS 和 BFS,下面都列出来大家看下效率和具体实现方法。

DFS(深度优先搜索)

根据题目得出,机器人不能往回走,并且每个格子还有一个进入的方向,那么机器人可以走的就只有3个方向。但是我们用的是DFS(深度优先搜索),就像不撞南墙不回头的牛一样。实际上只有向右,向下,两个方向。

我们试想一下,他会一直沿着一个方向走到不能走,然后回溯。那么这个时候回溯的时候我们在进行向下,向右,就可以达到所有的地方。

详解见代码哦!!!

BFS(广度优先搜索)

当然也可以用BFS(广度优先搜索),相比于DFS,BFS就比较灵活咯。

BFS不是一条道走下去,他会把离他最近的都访问一遍,访问完之后才开始访问第二近的……,直到访问完全部的。

BFS使用最好的一种数据结构就是使用队列,因为队列是先进先出,离他最近的访问完之后加入到队列中,最先入队的也是最先出队的。

具体代码与DFS相差不多,详见代码注释哦!!!

代码与结果


DFS(深度优先搜索)


public int movingCount(int threshold, int rows, int cols) {

    //临时变量visited记录格子是否被访问过

    boolean[][] visited = new boolean[rows][cols];

    return dfs(0, 0, rows, cols, threshold, visited);

}

 

public int dfs(int i, int j, int rows, int cols, int threshold, boolean[][] visited) {

    //i >= rows || j >= cols是边界条件的判断,threshold < sum(i, j)判断当前格子坐标是否

    // 满足条件,visited[i][j]判断这个格子是否被访问过

    if (i >= rows || j >= cols || threshold < sum(i, j) || visited[i][j])

        return 0;

    //标注这个格子被访问过

    visited[i][j] = true;

    //沿着当前格子的右边和下边继续访问

    return 1 + dfs(i + 1, j, rows, cols, threshold, visited) +

            dfs(i, j + 1, rows, cols, threshold, visited);

}

 

//计算两个坐标数字的和

private int sum(int i, int j) {

    int sum = 0;

    //计算坐标i所有数字的和

    while (i != 0) {

        sum += i % 10;

        i /= 10;

    }

    //计算坐标j所有数字的和

    while (j != 0) {

        sum += j % 10;

        j /= 10;

    }

    return sum;

}





### 最后

看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面

小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>

![image](https://img-blog.csdnimg.cn/img_convert/9764d93d51440683cebc1ce18045dc51.webp?x-oss-process=image/format,png)

针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺

![image](https://img-blog.csdnimg.cn/img_convert/8b75e76bb0edb34fde8bfd5b2d80f785.webp?x-oss-process=image/format,png)

> 全都是一丢一丢的收集整理纯手打出来的


更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

![image](https://img-blog.csdnimg.cn/img_convert/701455c9ec4076b28d923a696e787ced.webp?x-oss-process=image/format,png)

![image](https://img-blog.csdnimg.cn/img_convert/5bf762d3fcd018f1bd5c9e7008f37f61.webp?x-oss-process=image/format,png)

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

[外链图片转存中...(img-203YykEd-1715478362138)]

[外链图片转存中...(img-BHH6yT8d-1715478362139)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值