嗨咯,大家好,我是Ling,今天是我用豆包MarsCode刷题的第一天。系统默认提供了100道题目,用户也可以自己添加,这个功能挺不错的。
题目1:岛屿数量
从上图可以看到,将自定义的题目添加上去后,ai助手可以比较精确的提示做题思路。使用起来其实很方便,官方也有文档指导。
对于这道经典的题目,可以看到给出的提示是非常全的:
对于这道计算岛屿数量的题目,我们可以这样理解:
问题理解: 我们需要在给定的二维网格中找出相互独立的陆地区域,这些陆地区域被水包围且相邻陆地相连,每个独立的陆地区域就是一个岛屿。
数据结构选择: 可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来遍历网格。通常会使用一个二维布尔数组来标记已经访问过的单元格,防止重复访问。
算法步骤:
1. 遍历整个二维网格。
1. 对于每个未访问过的陆地单元格(值为 '1'),执行以下操作:
- 标记该单元格为已访问。
- 通过 DFS 或 BFS 算法,从该单元格开始向四周扩展,访问所有相邻的陆地单元格,并标记为已访问。
- 岛屿数量加 1。
按照这个提示写出来的代码:
class Solution {
public int numIslands(char[][] grid) {
int res = 0;
// 遍历
for(int i = 0; i < grid.length; i++) {
for(int j = 0; j < grid[i].length; j++) {
// 执行dfs
if(grid[i][j] == '1') {
// dfs
dfs(grid, i, j);
res++;
}
}
}
return res;
}
public void dfs(char[][] grid, int i, int j) {
// 终止条件
if(i < 0 || j < 0 || i == grid.length || j == grid[i].length ||grid[i][j] == '0') {
return;
}
// 将当前标记为已访问
grid[i][j] = '0';
dfs(grid, i + 1, j);
dfs(grid, i - 1, j);
dfs(grid, i, j + 1);
dfs(grid, i, j - 1);
}
}
其实,这类问题中,有回溯的思想,不进行详细展开了。
类似题目进阶的有岛屿最大面积,其实思路一致,只不过是dfs的函数需要记录每个岛屿的单元个数。同样,我们把题目添加进来:
题目2: 岛屿最大面积
这一次,我让助手帮生成了代码,经过验证生成的代码还是比较靠谱的!同样的我在leetcode上已经作答了这个题目,目前看这个助手给到的代码提示的思路是比较清晰。
我们再次进行使用,这次计划将题目的复杂度变得高些(纯通过文字描述比较难理解)的迷宫问题
题目3:迷宫问题II
针对这道题目,相信大家都知道怎么添加进去了,所以不贴图了。首先针对这个题目,给出的思路是这样的
对于这道迷宫球的问题,我们可以这样理解:
问题理解: 我们需要找到球从起始位置滚到目的地的最短路径,球会一直沿着一个方向滚动直到碰到墙才停下。
数据结构选择: 可以考虑使用广度优先搜索(Breadth-First Search,BFS)来解决这个问题。因为 BFS 能够保证先搜索到距离起始点较近的节点,从而找到最短路径。
算法步骤:
- 首先创建一个队列来存储待扩展的节点,每个节点包含球的位置和已经走过的步数。
- 将起始位置加入队列,并标记为已访问。
- 从队列中取出一个节点,对其四个方向(上、下、左、右)进行扩展。
- 如果扩展的位置是合法的(在迷宫范围内且为空地且未被访问过),则将其加入队列,并标记为已访问,同时记录走过的步数。
- 重复步骤 3 和 4,直到队列为空或者找到目的地。
其中提示说到BFS可以保证先找到最短的距离,可能有的小伙伴不理解这句话,没关系!豆包也可以帮我们讲解!
图片可能不够清晰,我把文字贴在下面:
广度优先搜索(Breadth-First Search,BFS)是一种图或树的遍历算法。在这个迷宫球的问题中选择 BFS 主要有以下原因:
BFS 会逐层地探索节点。也就是说,它先访问距离起始点距离为 1 的所有节点,然后是距离为 2 的节点,以此类推。
这一特性使得 BFS 能够首先找到距离起始点较近的路径。对于寻找最短路径的问题,比如我们这个迷宫球到达目的地的最短路径,BFS 非常适用。
因为它保证了在找到任何路径时,首先找到的就是最短路径。相比之下,其他一些搜索算法可能会先探索更深层次的节点,不一定能最先找到最短路径。
豆包已经给了如此清晰的思路,代码我就不贴了~我继续去刷题了
总结
相信通过这三道题目,加上豆包的辅助,你的刷题之路一定会变的更加有趣!