日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[Leedcode][JAVA][第542题][01矩阵][BFS]

發(fā)布時(shí)間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leedcode][JAVA][第542题][01矩阵][BFS] 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【問(wèn)題描述】542. 01 矩陣

給定一個(gè)由 0 和 1 組成的矩陣,找出每個(gè)元素到最近的 0 的距離。 兩個(gè)相鄰元素間的距離為 1 。 示例 : 輸入: 0 0 0 0 1 0 1 1 1 輸出: 0 0 0 0 1 0 1 2 1 注意: 給定矩陣的元素個(gè)數(shù)不超過(guò) 10000。 給定矩陣中至少有一個(gè)元素是 0。 矩陣中的元素只在四個(gè)方向上相鄰: 上、下、左、右。

【解答思路】

1. BFS
  • 隊(duì)列 先進(jìn)先出 多個(gè)或一個(gè)“元素”入隊(duì)列
  • 依次彈出元素 判斷邊界 距離加+1
    時(shí)間復(fù)雜度:O(N^2) 空間復(fù)雜度:O(N^2)
class Solution {int[][] directions = new int[][]{{0,-1},{0,1},{1,0},{-1,0}};public int[][] updateMatrix(int[][] matrix) {if (matrix == null || matrix.length == 0) return matrix;int n = matrix.length, m = matrix[0].length;int[][] res = new int[n][m];// 標(biāo)記當(dāng)前位置是否都看過(guò)boolean[][] visited = new boolean[n][m];// BFS 隊(duì)列Queue<int []> queue = new LinkedList<>();for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {// 將 0 全部放入隊(duì)列if (matrix[i][j] == 0) {queue.offer(new int[]{i, j});visited[i][j] = true;}}}while (!queue.isEmpty()){int[] top = queue.poll();int x = top[0], y = top[1];// BFS 搜索四個(gè)方向for (int[] direction : directions) {int newX = x + direction[0];int newY = y + direction[1];if (newX < 0 || newX >= n || newY < 0 || newY >= m || visited[newX][newY]) continue;res[newX][newY] = res[x][y] + 1; // 距離更新visited[newX][newY] = true;queue.add(new int[]{newX, newY}); // 新元素入隊(duì)}}return res;} }

【總結(jié)】

1. BFS 隊(duì)列 先進(jìn)先出
2. BFS 圖形題目
int[][] directions = new int[][]{{0,-1},{0,1},{1,0},{-1,0}};// 標(biāo)記當(dāng)前位置是否都看過(guò)boolean[][] visited = new boolean[n][m];// BFS 隊(duì)列 Queue<int []> queue = new LinkedList<>();
3.隊(duì)列基本操作

Queue是在兩端出入的List,所以也可以用數(shù)組或鏈表來(lái)實(shí)現(xiàn)。

  • add 增加一個(gè)元索 如果隊(duì)列已滿,則拋出一個(gè)IIIegaISlabEepeplian異常
  • remove 移除并返回隊(duì)列頭部的元素 如果隊(duì)列為空,則拋出一個(gè)NoSuchElementException異常
  • element 返回隊(duì)列頭部的元素 如果隊(duì)列為空,則拋出一個(gè)NoSuchElementException異常
  • offer 添加一個(gè)元素并返回true 如果隊(duì)列已滿,則返回false
  • poll 移除并返問(wèn)隊(duì)列頭部的元素 如果隊(duì)列為空,則返回null
  • peek 返回隊(duì)列頭部的元素 如果隊(duì)列為空,則返回null
  • put 添加一個(gè)元素 如果隊(duì)列滿,則阻塞
  • take 移除并返回隊(duì)列頭部的元素 如果隊(duì)列為空,則阻塞
注意
  • remove、element、offer 、poll、peek 其實(shí)是屬于Queue接口。

  • add remove element操作在隊(duì)滿或者隊(duì)空的時(shí)候會(huì)報(bào)異常。

  • offer poll peek 在隊(duì)滿或者隊(duì)空的時(shí)候不會(huì)報(bào)異常。

  • put take操作屬于阻塞操作。隊(duì)滿隊(duì)空均會(huì)阻塞。

總結(jié)

以上是生活随笔為你收集整理的[Leedcode][JAVA][第542题][01矩阵][BFS]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。