算法BFS经典例题(迷宫,多源BFS,BFS解决拓扑排序,FloodFill算法)

简介: 算法BFS经典例题(迷宫,多源BFS,BFS解决拓扑排序,FloodFill算法)

int[2][3]

力扣733.图像渲染

FloodFill算法

洪水灌溉

广度优先遍历的本质就是暴力遍历  把所有的结果都走一遍(具体说怎么走的方向没有谈及,说是二叉树遍历,但是实际上也就是一层全部走完,并没有什么特定的规律说是往哪里走完)

class Solution {
     int[]dx={0,0,1,-1};
    int[]dy={1,-1,0,0};
    public int[][] floodFill(int[][] image, int sr, int sc, int color) {
        int prev=image[sr][sc];
        if(prev==color) return image;
        //m是横着的下标和,n是竖着的下标和
        int m=image.length,n=image[0].length;
 
        Queue<int[]>q=new LinkedList<>();
        //把初始两个下标放到了数组里面,然后队列add的是这个数组
        q.add(new int[]{sr,sc});
 
        while(!q.isEmpty()){
            //取出队列的开头
            int []t=q.poll;
            //a,b表示的是取出来的下标
            int a=t[0],b=t[1];
            image[a][b]=color;
            //为什么是小于4因为对应的是4个方向
            for(int i=0;i<4;i++){
                int x=a+dx[i],y=b+dy[i];
                //看他越不越界,并且看他是否和目标元素相同,而且因为我们是边遍历,边去修改,所以最开始的值是发生变化了,所以不回再次进入循环
                if(x>=0&&x<m&&y<n&&image[x][y]==prev){
                    //把符合要求数值下标加入队列里面,然后
                    q.add(new int[]{x,y});
                }
            }
        }
   return image;
 
    }
}

力扣200.岛屿数量


1.直接修改原数组

2.vis[m][n]实施标记,在原先的数组情况下,给予一层标记,遍历过的使用true;

这里比较难的地方是他的代码编写,思想其实挺好理解,存下标,用一个队列存储,然后看是不是你要的(唯一比较难的根据题意,上一道题是找相同的数,这个题意很清晰,但是这道题是要找所谓的“岛屿”,这也需要你理解这个所谓的岛屿什么的究竟是什么意思,这道题,他的岛屿的含义就是把周围的一圈是陆地的都标记了,假如说周围是水,那么不耽误,假如周围不是全是水,那么把他上下左右标记一圈,到达下一个然后看扫描你的上下左右,看你的上下左右有没有也是岛屿的,假如遇到标记的就跳过。

生活思维:岛屿是被水包围的,总想是围棋一样,我们未培养起来编程思维,就感觉不知道从何下手

但是编程思维,就是先把一圈走了,看看上下左右的分布,是陆地的标记,他能把从第一个开始到不是这块的,都统计为一个,然后是水的就不标记,直接跳过,直到再找到一块岛屿,在遍历他的周围,周围没有的话,就再加一以此反复。

class Solution {
   int[]dx={0,0,1,-1};
     int[]dy={1,-1,0,0};
    boolean[][] vis=new boolean[301][301];
    int m,n;
    public int numIslands(char[][] grid) {
         m=grid.length;
         n=grid[0].length;
        int ret=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
            if (grid[i][j]=='1'&&vis[i][j]==false){
                ret++;
              bfs(grid,i,j);
            }
        }
    }
    return ret;
    }
    
    public void bfs(char[][]grid,int i,int j){
        //在q里和那个图像渲染一样,在q里加入初始位置的下标
        Queue<int[]>q=new LinkedList<>();
        q.add(new int[]{i,j});
        vis[i][j]=true;
        
        while(!q.isEmpty()){
        int[]t=q.poll();
        int a=t[0],b=t[1];
        for(int k=0;k<4;k++){
           int x=a+dx[k],y=b+dy[k];
           if(x>=0&& x<m&& y>=0&& y<n&&grid[x][y]=='1' && vis[x][y]==false){
           q.add(new int[]{x,y});
           vis[x][y]=true;  
               }
           } 
       }
    }
}

力扣695岛屿最大面积

class Solution {
    int[]dx={0,0,1,-1};
    int[]dy={1,-1,0,0};
    int sum=0;
    int m,n;
    boolean[][]vis=new boolean[51][51];
    public int maxAreaOfIsland(int[][] grid) {
    m=grid.length;
    n=grid[0].length;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
         if(grid[i][j]==1&&vis[i][j]==false)
          sum=Math.max(sum,bfs(grid,i,j));
        }
    }
return sum;
    }
    public int bfs(int[][]grid,int i,int j){
    int count=0;
    Queue<int[]>q=new LinkedList<>();
    q.add(new int[]{i,j});
    vis[i][j]=true;
    count++;
    while(!q.isEmpty()){
    int[]t=q.poll();
    int a=t[0];     
    int b=t[1];
     for(int k=0;k<4;k++){
     int x=a+dx[k];
     int y=b+dy[k];
         if(x>=0&&x<m&&y>=0&&y<n&&vis[x][y]==false&&grid[x][y]==1){        q.add(new int[]{x,y});
             count++;
             vis[x][y]=true;
         }
    }
 }
 return count;
    }
 
}

力扣130.被围绕的区域(微难)

恶补二维数组知识

为神马说他微难呢?是因为当我们想用套模版莽夫做这个题,会发现一个问题,就是他怎么判断是否被包围,我们之前的都是边判断边修改,这个需要你看一圈之后,才判断是否需要修改。

解法:正难则反:先去把周围都给处理改成一个点,不影响判断的,只要把四边相邻的处理(这些事不被包围的)然后再去扫描矩阵,然后再去恢复成O

注意:小细节,这道题不需要统计xx数量,所以不需要我们搞一个boolean去标记

此外,这个题的正难则反,是bfs也去用来扫描矩阵,而中间的都是被包围的,所以不需要做处理,只需要都遍历的时候,把中间的一圈改成x,因为未被包围的我们都改成.了,所以不会影响我们操作,最后把.换回X即可

class Solution {
    int[]dx={0,0,1,-1};
    int[]dy={1,-1,0,0};
    int m,n;
    public void solve(char[][] board) {
        m=board.length;
        n=board[0].length;
        for(int i=0;i<m;i++){
            if(board[i][0]=='O')
            bfs(board,i,0);
            if(board[i][n-1]=='O')
            bfs(board,i,n-1);
        }
         for(int j=0;j<n;j++){
          if(board[0][j]=='O')
            bfs(board,0,j);
          if(board[m-1][j]=='O')
            bfs(board,m-1,j);
         }
     for(int i=0;i<m;i++){
     for(int j=0;j<n;j++){
    if(board[i][j]=='O')
           board[i][j]='X';
           else if(board[i][j]=='.')
           board[i][j]='O';
         }
     }
    }
    public void bfs(char[][]board,int i,int j){
        Queue<int[]>q=new LinkedList<>();
        q.add(new int[]{i,j});
        board[i][j]='.';
        while(!q.isEmpty()){
             int[]t=q.poll();
             int a=t[0];
             int b=t[1];
         for(int k=0;k<4;k++){
             int x=a+dx[k];
             int y=b+dy[k];
             if(x>0&&x<m-1&&y>0&&y<n-1&&board[x][y]=='O'){
                 q.add(new int[]{x,y});
                 board[x][y]='.';  
             }
         }   
        }
    }
}


相关文章
|
4月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
1月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
95 8
|
1月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
109 7
|
3月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
2月前
|
搜索推荐 Shell
解析排序算法:十大排序方法的工作原理与性能比较
解析排序算法:十大排序方法的工作原理与性能比较
73 9
|
2月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
38 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
2月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
34 0
|
2月前
|
算法 定位技术
数据结构与算法学习九:学习递归。递归的经典实例:打印问题、阶乘问题、递归-迷宫问题、八皇后问题
本文详细介绍了递归的概念、重要规则、形式,并展示了递归在解决打印问题、阶乘问题、迷宫问题和八皇后问题等经典实例中的应用。
53 0
|
2月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
79 0
|
2月前
|
机器学习/深度学习 存储 算法
数据结构与算法——BFS(广度优先搜索)
数据结构与算法——BFS(广度优先搜索)
下一篇
DataWorks