做网站白云,广告联盟挂机,网站建设怎么上传不了图片,微信营销的模式目录
力扣733.图像渲染
力扣200.岛屿数量
力扣695岛屿最大面积
力扣130.被围绕的区域#xff08;微难#xff09; int[2][3] 力扣733.图像渲染 FloodFill算法 洪水灌溉 广度优先遍历的本质就是暴力遍历 把所有的结果都走一遍#xff08;具体说怎么走的方向没有谈及微难 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 previmage[sr][sc];if(prevcolor) return image;//m是横着的下标和n是竖着的下标和int mimage.length,nimage[0].length;Queueint[]qnew LinkedList();//把初始两个下标放到了数组里面然后队列add的是这个数组q.add(new int[]{sr,sc});while(!q.isEmpty()){//取出队列的开头int []tq.poll;//a,b表示的是取出来的下标int at[0],bt[1];image[a][b]color;//为什么是小于4因为对应的是4个方向for(int i0;i4;i){int xadx[i],ybdy[i];//看他越不越界并且看他是否和目标元素相同,而且因为我们是边遍历边去修改所以最开始的值是发生变化了所以不回再次进入循环if(x0xmynimage[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[][] visnew boolean[301][301];int m,n;public int numIslands(char[][] grid) {mgrid.length;ngrid[0].length;int ret0;for(int i0;im;i){for(int j0;jn;j){if (grid[i][j]1vis[i][j]false){ret;bfs(grid,i,j);}}}return ret;}public void bfs(char[][]grid,int i,int j){//在q里和那个图像渲染一样在q里加入初始位置的下标Queueint[]qnew LinkedList();q.add(new int[]{i,j});vis[i][j]true;while(!q.isEmpty()){int[]tq.poll();int at[0],bt[1];for(int k0;k4;k){int xadx[k],ybdy[k];if(x0 xm y0 yngrid[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 sum0;int m,n;boolean[][]visnew boolean[51][51];public int maxAreaOfIsland(int[][] grid) {mgrid.length;ngrid[0].length;for(int i0;im;i){for(int j0;jn;j){if(grid[i][j]1vis[i][j]false)sumMath.max(sum,bfs(grid,i,j));}}
return sum;}public int bfs(int[][]grid,int i,int j){int count0;Queueint[]qnew LinkedList();q.add(new int[]{i,j});vis[i][j]true;count;while(!q.isEmpty()){int[]tq.poll();int at[0]; int bt[1];for(int k0;k4;k){int xadx[k];int ybdy[k];if(x0xmy0ynvis[x][y]falsegrid[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) {mboard.length;nboard[0].length;for(int i0;im;i){if(board[i][0]O)bfs(board,i,0);if(board[i][n-1]O)bfs(board,i,n-1);}for(int j0;jn;j){if(board[0][j]O)bfs(board,0,j);if(board[m-1][j]O)bfs(board,m-1,j);}for(int i0;im;i){for(int j0;jn;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){Queueint[]qnew LinkedList();q.add(new int[]{i,j});board[i][j].;while(!q.isEmpty()){int[]tq.poll();int at[0];int bt[1];for(int k0;k4;k){int xadx[k];int ybdy[k];if(x0xm-1y0yn-1board[x][y]O){q.add(new int[]{x,y});board[x][y].; }} }}
}