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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leedcode][JAVA][第542题][01矩阵][BFS] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】542. 01 矩陣

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

【解答思路】

1. BFS
  • 隊列 先進先出 多個或一個“元素”入隊列
  • 依次彈出元素 判斷邊界 距離加+1
    時間復雜度:O(N^2) 空間復雜度: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];// 標記當前位置是否都看過boolean[][] visited = new boolean[n][m];// BFS 隊列Queue<int []> queue = new LinkedList<>();for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {// 將 0 全部放入隊列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 搜索四個方向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}); // 新元素入隊}}return res;} }

【總結】

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

Queue是在兩端出入的List,所以也可以用數組或鏈表來實現。

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

  • add remove element操作在隊滿或者隊空的時候會報異常。

  • offer poll peek 在隊滿或者隊空的時候不會報異常。

  • put take操作屬于阻塞操作。隊滿隊空均會阻塞。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。