網格圖--Day07--網格圖DFS--LCP 63. 彈珠游戲,305. 島嶼數量 II,2061. 掃地機器人清掃過的空間個數,489. 掃地機器人,2852. 所有單元格的遠離程度之和

網格圖–Day07–網格圖DFS–LCP 63. 彈珠游戲,305. 島嶼數量 II,2061. 掃地機器人清掃過的空間個數,489. 掃地機器人,2852. 所有單元格的遠離程度之和

今天要訓練的題目類型是:【網格圖DFS】,題單來自@靈茶山艾府。

適用于需要計算連通塊個數、大小的題目。

部分題目做法不止一種,也可以用 BFS 或并查集解決。

LCP 63. 彈珠游戲

思路:

不用dfs,彈射進去只會有一條成功的路徑,要么成,要么不成。

注意,四個角不能作為入口。從索引1遍歷到m-2.

要從邊界的’.'出發,字母不能出發

class Solution {private final int[][] DIRS = new int[][] { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };private char[][] grid;private int n;private int m;// 不用dfs,彈射進去只會有一條成功的路徑,要么成,要么不成。// d是入射方向private boolean play(int x, int y, int d, int step) {while (step != 0) {x += DIRS[d][0];y += DIRS[d][1];if (x < 0 || x >= n || y < 0 || y >= m) {return false;}if (grid[x][y] == 'O') {return true;} else if (grid[x][y] == 'E') {d = (d + 1) % 4;} else if (grid[x][y] == 'W') {d = (d - 1 + 4) % 4;}step--;}return false;}public int[][] ballGame(int num, String[] plate) {n = plate.length;m = plate[0].length();grid = new char[n][m];for (int i = 0; i < n; i++) {grid[i] = plate[i].toCharArray();}List<int[]> list = new ArrayList<>();// 注意,四個角不能作為入口。從索引1遍歷到m-2for (int j = 1; j < m - 1; j++) {// 要從邊界的'.'出發,字母不能出發if (grid[0][j] == '.' && play(0, j, 1, num)) {list.add(new int[] { 0, j });}if (grid[n - 1][j] == '.' && play(n - 1, j, 3, num)) {list.add(new int[] { n - 1, j });}}for (int i = 1; i < n - 1; i++) {if (grid[i][0] == '.' && play(i, 0, 0, num)) {list.add(new int[] { i, 0 });}if (grid[i][m - 1] == '.' && play(i, m - 1, 2, num)) {list.add(new int[] { i, m - 1 });}}return list.toArray(int[][]::new);}
}

305. 島嶼數量 II

方法:并查集

思路:

  1. 按照pos添加島嶼
  2. 未訪問過, 處理
    • 默認周圍沒有海水,當做新島嶼,所以島嶼數+1
    • 遍歷四周,如果有島嶼,要融入那個島嶼
    • 當旁邊的格子:已經訪問過(這樣才能視為陸地),且目前不屬于同一個島嶼
      • 將他們融入成一個島嶼
      • 新島嶼數量-1。因為這個格子已經屬于它周邊的島了。
class Solution {private final int[][] DIRS = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };public List<Integer> numIslands2(int m, int n, int[][] positions) {UnionFind u = new UnionFind(m * n);boolean[] visited = new boolean[m * n];List<Integer> res = new ArrayList<>();int count = 0;// 按照pos添加島嶼for (int[] pos : positions) {int x = pos[0];int y = pos[1];// 當前格子的唯一id,用它在grid中的索引值作為唯一idint ID = x * n + y;// 未訪問過, 處理if (!visited[ID]) {visited[ID] = true;// 默認周圍沒有海水,當做新島嶼,所以島嶼數+1count++;// 遍歷四周,如果有島嶼,要融入那個島嶼for (int[] dir : DIRS) {int nextX = x + dir[0];int nextY = y + dir[1];int nextID = nextX * n + nextY;// 旁邊的格子:已經訪問過(這樣才能視為陸地),且目前不屬于同一個島嶼if (nextX >= 0 && nextX < m && nextY >= 0 && nextY < n&& visited[nextID]&& !u.isSame(ID, nextID)) {// 將他們融入成一個島嶼u.join(ID, nextID);// 新島嶼數量-1。因為這個格子已經屬于它周邊的島了。count--;}}}res.add(count);}return res;}// 并查集class UnionFind {private int[] father;public UnionFind(int n) {father = new int[n + 1];for (int i = 0; i <= n; i++) {father[i] = i;}}public void join(int a, int b) {int root1 = find(a);int root2 = find(b);if (root1 == root2) {return;}father[root2] = root1;}public boolean isSame(int a, int b) {int root1 = find(a);int root2 = find(b);return root1 == root2;}public int find(int a) {if (father[a] != a) {father[a] = find(father[a]);}return father[a];}}
}

方法:DFS

思路:

雙矩陣法。使用grid記錄陸地,使用mark記錄帶有編號的島嶼。

  1. 初始化關鍵變量,包括記錄地形的 grid 數組、標記連通塊的 mark 數組、存儲新島嶼編號的 currentMark、島嶼計數 count 及結果存儲列表 answer,同時定義四個方向偏移坐標偏移數組 DIRS;
  2. 遍歷每個待添加的陸地位置 (r,c),若該位置已是陸地,直接將當前 count 加入 answer 并跳過后續操作;
  3. 若為新陸地,將 grid [r][c] 設為 1,count 加 1(初始視為新島嶼);
  4. 遍歷四個方向的相鄰格子,收集滿足 “在網格內、是陸地、已標記島嶼編號” 條件的相鄰島嶼編號,用 Set 去重得到 neighbors 集合;
  5. 用 count 減去 neighbors 集合大小,實現相鄰島嶼的合并計數更新;
  6. 確定目標標記 targetMark(無相鄰島嶼則用 currentMark 并自增,有則取 neighbors 中最小編號),通過 DFS 將 (r,c) 及連通陸地統一標記為 targetMark;
  7. 將本次操作后的 count 加入 answer;
  8. 重復步驟 2-7 直至所有陸地添加完畢,最終返回 answer。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;class Solution {// 四個方向:上、下、左、右private final int[][] DIRS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};private int[][] grid;       // 真實地圖:0=水,1=陸地private int[][] mark;       // 連通塊標記:0=未標記,>=1=不同連通塊的唯一編號private int currentMark;    // 當前可用的島嶼編號(從1開始遞增)private int m;              // 網格行數private int n;              // 網格列數public List<Integer> numIslands2(int m, int n, int[][] positions) {this.m = m;this.n = n;this.grid = new int[m][n];       // 初始全為0(水)this.mark = new int[m][n];       // 初始全為0(未標記)this.currentMark = 1;            // 第一個島嶼從1開始標記List<Integer> answer = new ArrayList<>();int count = 0;                   // 當前島嶼數量for (int[] pos : positions) {int r = pos[0];int c = pos[1];// 1. 處理重復添加:若當前位置已是陸地,直接記錄當前countif (grid[r][c] == 1) {answer.add(count);continue;}// 2. 標記為陸地,初始視為新島嶼grid[r][c] = 1;count++;// 3. 收集相鄰陸地的島嶼編號(去重,避免重復合并)Set<Integer> neighbors = new HashSet<>();for (int[] dir : DIRS) {int nr = r + dir[0];int nc = c + dir[1];// 相鄰位置需在網格內,且是陸地、已標記島嶼if (nr >= 0 && nr < m && nc >= 0 && nc < n && grid[nr][nc] == 1 && mark[nr][nc] != 0) {neighbors.add(mark[nr][nc]);}}// 4. 合并島嶼:每有一個不重復的相鄰島嶼,島嶼數減1count -= neighbors.size();// 5. 標記新陸地的連通塊:// 若有相鄰連通塊,將新陸地及所有相鄰連通塊統一標記為最小的編號(避免重復標記)// 若沒有相鄰連通塊,用新編號標記int targetMark = neighbors.isEmpty() ? currentMark++ : getMin(neighbors);dfsMark(r, c, targetMark);// 6. 記錄本次操作后的島嶼數answer.add(count);}return answer;}// DFS:將當前陸地及所有連通的陸地,統一標記為targetMarkprivate void dfsMark(int r, int c, int targetMark) {// 終止條件:超出網格、不是陸地、已標記為targetMark(避免重復遞歸)if (r < 0 || r >= m || c < 0 || c >= n || grid[r][c] != 1 || mark[r][c] == targetMark) {return;}// 標記為目標島嶼編號mark[r][c] = targetMark;// 遞歸處理四個方向的連通陸地for (int[] dir : DIRS) {dfsMark(r + dir[0], c + dir[1], targetMark);}}// 輔助函數:獲取集合中的最小值(用于統一連通塊編號)private int getMin(Set<Integer> marks) {int min = Integer.MAX_VALUE;for (int mark : marks) {if (mark < min) {min = mark;}}return min;}
}

方法:DFS

思路:

單矩陣法。使用grid一個矩陣,0是水,其他值為染色標記mark值。

這時候,不能從pos的位置進入dfs。因為dfs判斷結束的時候,需要用grid[r][c] == 0 || grid[r][c] == mark來讓遞歸結束。從pos位置進入的話,沒有辦法遍歷到neighbors。

在pos的位置,如果有neighbors的話,要四個方向去dfs。

class Solution {private final int[][] DIRS = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };private int[][] grid;private int mark = 0;private int m;private int n;public List<Integer> numIslands2(int m, int n, int[][] positions) {this.m = m;this.n = n;this.grid = new int[m][n];List<Integer> answer = new ArrayList<>();int count = 0;for (int[] pos : positions) {int r = pos[0];int c = pos[1];// 已標記過的陸地if (grid[r][c] != 0) {answer.add(count);continue;}// 新陸地初始視為獨立島嶼,計數+1count++;// 收集相鄰的所有連通塊編號(去重,避免重復處理同一連通塊)Set<Integer> neighbors = new HashSet<>();for (int[] dir : DIRS) {int nr = r + dir[0];int nc = c + dir[1];if (nr >= 0 && nr < m && nc >= 0 && nc < n && grid[nr][nc] != 0) {neighbors.add(grid[nr][nc]);}}// 合并島嶼:每有一個獨立的相鄰連通塊,計數-1(因為要合并成1個)count -= neighbors.size();// 用新編號統一所有連通塊(新陸地+相鄰舊連通塊)int targetMark = neighbors.isEmpty() ? ++mark : minNeighborMark(neighbors);grid[r][c] = targetMark;for (int[] dir : DIRS) {int nr = r + dir[0];int nc = c + dir[1];if (nr >= 0 && nr < m && nc >= 0 && nc < n && grid[nr][nc] != 0) {dfs(nr, nc, targetMark);}}// 5. 記錄本次操作后的島嶼數answer.add(count);}return answer;}// DFS:將所有連通的舊編號陸地,改為目標新編號private void dfs(int r, int c, int mark) {// 終止條件:越界 / 不是陸地(未標記) / 已改為目標編號(避免重復遞歸)if (r < 0 || r >= m || c < 0 || c >= n || grid[r][c] == 0 || grid[r][c] == mark) {return;}grid[r][c] = mark;// 遞歸處理四個方向的連通陸地for (int[] dir : DIRS) {dfs(r + dir[0], c + dir[1], mark);}}private int minNeighborMark(Set<Integer> set) {int min = Integer.MAX_VALUE;for (int i : set) {min = Math.min(min, i);}return min;}
}

當然,不復用最小編號也是可以的,每次都用新編號。然后在pos位置,遍歷四個方向,把全部neighbors的編號全部改成新編號。不過這樣會非常耗時。

// 用新編號統一所有連通塊(新陸地+相鄰舊連通塊)
grid[r][c] = ++mark;
// 遍歷所有舊連通塊的起始位置,確保每個舊連通塊都被改為新編號
for (int[] dir : DIRS) {int nr = r + dir[0];int nc = c + dir[1];// 對每個相鄰的舊陸地,執行DFS更新編號if (nr >= 0 && nr < m && nc >= 0 && nc < n && grid[nr][nc] != 0) {dfs(nr, nc, mark);}
}

2061. 掃地機器人清掃過的空間個數

思路:

!關鍵!:不能以同一個方向進入這個格子,可以不同的方向進入。

  1. 使用boolean[][][] visited;記錄進入某個格子的的方向,每一個格子可以有四個方向進入。
  2. 使用boolean[][] cleaned;記錄格子是否被清潔
  3. 開始DFS
    1. 不能以同一個方向進入這個格子,可以不同的方向進入。if (visited[i][j][dir]) {return;}
    2. 記錄,以當前方向進入過格子:visited[i][j][dir] = true;
    3. 還沒清潔,就清潔。if (visited[i][j][dir]) {return;}visited[i][j][dir] = true;
    4. 計算當前方向的下一個位置int x = i + DIRS[dir][0];int y = j + DIRS[dir][1];
    5. 可前進則繼續沿當前方向走dfs(x, y, dir);,否則轉向dfs(i, j, (dir + 1) % 4);
class Solution {private final int[][] DIRS = new int[][] { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };private int n;private int m;private int[][] grid;// 清潔的格子數private int count;// 記錄進入某個格子的的方向,每一個格子可以有四個方向進入。[n][m][4]private boolean[][][] visited;// 記錄格子是否被清潔private boolean[][] cleaned;public int numberOfCleanRooms(int[][] room) {grid = room;n = grid.length;m = grid[0].length;visited = new boolean[n][m][4];cleaned = new boolean[n][m];dfs(0, 0, 0);return count;}private void dfs(int i, int j, int dir) {// !關鍵:不能以同一個方向進入這個格子,可以不同的方向進入。if (visited[i][j][dir]) {return;}visited[i][j][dir] = true;// 還沒清潔,就清潔。(也就是第一次進入這個格子)if (!cleaned[i][j]) {cleaned[i][j] = true;count++;}// 計算當前方向的下一個位置int x = i + DIRS[dir][0];int y = j + DIRS[dir][1];// 可前進則繼續沿當前方向走,否則轉向if (x >= 0 && x < n && y >= 0 && y < m && grid[x][y] == 0) {dfs(x, y, dir);} else {dfs(i, j, (dir + 1) % 4);}}
}

思路:

使用set來操作。

Set<String> visited;記錄i + "," + j + "," + dir;

Set<String> cleaned;記錄i + "," + j;

class Solution {private final int[][] DIRS = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };private int n;private int m;private int[][] grid;// 記錄「位置+方向」,避免重復處理private Set<String> visited;// 記錄被清掃的位置private Set<String> cleaned;public int numberOfCleanRooms(int[][] room) {grid = room;n = grid.length;m = grid[0].length;visited = new HashSet<>();cleaned = new HashSet<>();dfs(0, 0, 0);return cleaned.size();}private void dfs(int i, int j, int dir) {// 不能以同一個方向進入這個格子,可以不同的方向進入。String posDir = i + "," + j + "," + dir;if (visited.contains(posDir)) {return;}visited.add(posDir);// 清潔當前房間(再清潔一次也無所謂,反正是set)String pos = i + "," + j;cleaned.add(pos);// 計算當前方向的下一個位置int x = i + DIRS[dir][0];int y = j + DIRS[dir][1];// 可前進則繼續沿當前方向走,否則轉向if (x >= 0 && x < n && y >= 0 && y < m && grid[x][y] == 0) {dfs(x, y, dir);} else {dfs(i, j, (dir + 1) % 4);}}
}

489. 掃地機器人

思路:

  • 開始dfs
    1. 機器人先打掃完當前位置
    2. 然后嘗試往四個方向走
      1. 如果下一個位置沒走過且不是障礙,就前往打掃。dfs下一個。然后回溯,返回。
    3. 下一個方向。
class Solution {// 上,右,下,左private final int[][] ds = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } };private Robot robot;private Set<String> visited;private void dfs(int i, int j, int dir) {// 機器人先打掃完當前位置visited.add(i + "," + j);robot.clean();// 然后嘗試往四個方向走for (int k = 0; k < 4; k++) {int d = (dir + k) % 4;int x = i + ds[d][0];int y = j + ds[d][1];if (!visited.contains(x + "," + y) && robot.move()) {// 如果下一個位置沒走過且不是障礙,就前往打掃dfs(x, y, d);// 回溯,返回goBack();}// 下一個方向。(dir + k) % 4是代碼層面右轉,robot.turnRight是操作機器人右轉robot.turnRight();}}private void goBack() {// 機器人退回到上一個位置(它進來前的位置,且保持進來時的朝向),相當于回溯robot.turnRight();robot.turnRight();robot.move();robot.turnRight();robot.turnRight();}public void cleanRoom(Robot robot) {this.robot = robot;visited = new HashSet<>();// 把機器人的初始坐標視為原點,初始方向朝上dfs(0, 0, 0);}
}

2852. 所有單元格的遠離程度之和

思路:

題意改寫:

每個格子為一個國家,格子的數值為國土面積。(會有值為-1的海水格子隔開國家)

相鄰接觸的國家為同一個聯盟的同盟國,不相連的其他國家為非同盟國。

當前格子的仇恨值,等于所有非同盟國的國土面積之和。

返回所有國家的總仇恨值。

解題步驟:

  1. 計算總面積:統計所有國家的國土面積

  2. 遇到一個聯盟,DFS它,統計 {聯盟的總面積,國家數}

  3. 當前聯盟的總仇恨值 = 國家數 * 仇恨值(非同盟國的國土面積)。

    • (其中非同盟國的面積 = 總面積 - 當前聯盟的面積)
    • (聯盟內,每個國家都要仇恨非同盟國,仇恨值是相等的)
    • 累加到res中,尋找下一個聯盟res += allyCount * (totalArea - allyArea);
class Solution {private static int[][] DIRS = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };private int n;private int[][] grid;private boolean[][] visited;// 返回 {聯盟的總面積,國家數}public long[] dfs(int i, int j) {// 已訪問visited[i][j] = true;// 初始化:當前格子的國土面積long allyArea = grid[i][j];// 初始化:當前格子是1個國家long allyCount = 1;// 遍歷相鄰的國家(同盟國)for (int[] dir : DIRS) {int x = i + dir[0];int y = j + dir[1];// 條件:索引合法,是陸地,沒訪問過if (x >= 0 && x < n && y >= 0 && y < n && grid[x][y] > 0 && !visited[x][y]) {// 獲取下一個同盟國的面積與數量long[] nextAlly = dfs(x, y);// 累加到,聯盟的總面積allyArea += nextAlly[0];// 累加到,聯盟的國家數allyCount += nextAlly[1];}}// 返回 {聯盟的總面積,國家數}return new long[] { allyArea, allyCount };}public long sumRemoteness(int[][] grid) {this.grid = grid;this.n = grid.length;this.visited = new boolean[n][n];// 總面積:統計所有國家的國土面積long totalArea = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (grid[i][j] > 0) {totalArea += grid[i][j];}}}// 所有國家的仇恨值總和long res = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {// 跳過海水,跳過已訪問if (grid[i][j] < 0 || visited[i][j]) {continue;}// 找到一個聯盟,遍歷這個聯盟的所有國家。返回 {聯盟的總面積,國家數}long[] ally = dfs(i, j);long allyArea = ally[0];long allyCount = ally[1];// 關鍵計算:當前聯盟的總仇恨值 = 國家數 * 仇恨值(非同盟國的國土面積)。// (其中非同盟國的面積 = 總面積 - 當前聯盟的面積)// (聯盟內,每個國家都要仇恨非同盟國,仇恨值是相等的)// 累加到res中,尋找下一個聯盟res += allyCount * (totalArea - allyArea);}}// 返回所有國家的仇恨值總和return res;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/web/95632.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95632.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95632.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多功能修改電腦機器碼序列號工具 綠色版

多功能修改電腦機器碼序列號工具 綠色版電腦機器碼序列號修改軟件是一款非常使用的數據化虛擬修改工具。機器碼修改軟件可以虛擬的定制您電腦上的硬件信息&#xff0c;軟件不會對您的電腦造成傷害。軟件不需要您有專業的知識&#xff0c;就可以模擬一份硬件信息。機器碼修改軟…

React Hooks深度解析:useState、useEffect及自定義Hook最佳實踐

React Hooks自16.8版本引入以來&#xff0c;徹底改變了我們編寫React組件的方式。它們讓函數組件擁有了狀態管理和生命周期方法的能力&#xff0c;使代碼更加簡潔、可復用且易于測試。本文將深入探討三個最重要的Hooks&#xff1a;useState、useEffect&#xff0c;以及如何創建…

期權平倉后權利金去哪了?

本文主要介紹期權平倉后權利金去哪了&#xff1f;期權平倉后權利金的去向需結合交易角色&#xff08;買方/賣方&#xff09;、平倉方式及市場價格變動綜合分析&#xff0c;具體可拆解為以下邏輯鏈條。期權平倉后權利金去哪了&#xff1f;1. 買方平倉&#xff1a;權利金的“差價…

2025國賽C題題目及最新思路公布!

C 題 NIPT 的時點選擇與胎兒的異常判 問題 1 試分析胎兒 Y 染色體濃度與孕婦的孕周數和 BMI 等指標的相關特性&#xff0c;給出相應的關系模 型&#xff0c;并檢驗其顯著性。 思路1&#xff1a;針對附件中孕婦的 NIPT 數據&#xff0c;首先對數據進行預處理&#xff0c;并對多…

NLP技術爬取

“NLP技術爬取”這個詞組并不指代一種單獨的爬蟲技術&#xff0c;而是指將自然語言處理&#xff08;NLP&#xff09;技術應用于網絡爬蟲的各個環節&#xff0c;以解決傳統爬蟲難以處理的問題&#xff0c;并從中挖掘出更深層次的價值。簡單來說&#xff0c;它不是指“用NLP去爬”…

讓錄音變得清晰的軟件:語音降噪AI模型與工具推薦

在數字內容創作日益普及的今天&#xff0c;無論是播客、線上課程、視頻口播&#xff0c;還是遠程會議&#xff0c;清晰的錄音質量都是提升內容專業度和觀眾體驗的關鍵因素之一。然而&#xff0c;由于環境噪音、設備限制等因素&#xff0c;錄音中常常夾雜各種干擾聲音。本文將介…

大話 IOT 技術(1) -- 架構篇

文章目錄前言拋出問題現有條件初步設想HTTP 與 MQTT中間的服務端完整的鏈路測試的虛擬設備實現后話當你迷茫的時候&#xff0c;請點擊 物聯網目錄大綱 快速查看前面的技術文章&#xff0c;相信你總能找到前行的方向 前言 Internet of Things (IoT) 就是物聯網&#xff0c;萬物…

【wpf】WPF 自定義控件綁定數據對象的最佳實踐

WPF 自定義控件綁定數據對象的最佳實踐&#xff1a;以 ImageView 為例 在 WPF 中開發自定義控件時&#xff0c;如何優雅地綁定數據對象&#xff0c;是一個經常遇到的問題。最近在實現一個自定義的 ImageView 控件時&#xff0c;我遇到了一個典型場景&#xff1a; 控件內部需要使…

[Dify 專欄] 如何通過 Prompt 在 Dify 中模擬 Persona:即便沒有專屬配置,也能讓 AI 扮演角色

在 AI 應用開發中,“Persona(角色扮演)”常被視為塑造 AI 個性與專業邊界的重要手段。然而,許多開發者在使用 Dify 時會疑惑:為什么我在 Chat 應用 / Agent 應用 / Workflow 里都找不到所謂的 Persona 配置項? 答案是:Dify 平臺目前并沒有內建的 Persona 配置入口。角色…

解決雙向循環鏈表中對存儲數據進行奇偶重排輸出問題

1. 概念 對鏈表而言,雙向均可遍歷是最方便的,另外首尾相連循環遍歷也可大大增加鏈表操作的便捷性。因此,雙向循環鏈表,是在實際運用中是最常見的鏈表形態。 2. 基本操作 與普通的鏈表完全一致,雙向循環鏈表雖然指針較多,但邏輯是完全一樣。基本的操作包括: 節點設計 初…

Kubernetes集群升級與etcd備份恢復指南

目錄 Kubernetes etcd備份恢復 集群管理命令 環境變量 查看etcd版本 查看etcd集群節點信息 查看集群健康狀態 查看告警事件 添加成員(單節點部署的etcd無法直接擴容)&#xff08;不用做&#xff09; 更新成員 刪除成員 數據庫操作命令 增加(put) 查詢(get) 刪除(…

【LeetCode熱題100道筆記】旋轉圖像

題目描述 給定一個 n n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。 你必須在 原地 旋轉圖像&#xff0c;這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉圖像。 示例 1&#xff1a;輸入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]…

SpringBoot【集成p6spy】使用p6spy-spring-boot-starter集成p6spy監控數據庫(配置方法舉例)

使用p6spy-spring-boot-starter集成p6spy監控數據庫1.簡單說明2.核心依賴3.主要配置4.簡單測試5.其他配置1.簡單說明 p6spy 類似于 druid 可以攔截 SQL 可以用于項目調試&#xff0c;直接引入 p6spy 的博文已經很多了&#xff0c;這里主要是介紹一下 springboot 使用 p6spy-sp…

擴散模型的優化過程,主要的公式推導,主要是熟悉一下整體的理論框架

核心思想與定義 擴散模型的核心思想是&#xff1a;學習一個去噪過程&#xff0c;以逆轉一個固定的加噪過程。前向過程&#xff08;固定&#xff09;&#xff1a; 定義一個馬爾可夫鏈&#xff0c;逐步向數據 x0~q(x0)\mathbf{x}_0 \sim q(\mathbf{x}_0)x0?~q(x0?) 添加高斯噪…

數字簽名、數字證書、數字信封的概念與區別

要理解數字簽名、數字證書、數字信封&#xff0c;核心是抓住它們各自的核心目標 —— 分別解決 “身份真實性與內容完整性”“公鑰可信度”“數據機密性” 問題&#xff0c;且三者都基于 “非對稱加密”&#xff08;一對公鑰、私鑰&#xff0c;公鑰公開、私鑰保密&#xff0c;用…

Day35 網絡協議與數據封裝

day35 網絡協議與數據封裝 數據封裝與協議結構 以太網MAC幀格式數據封裝與傳輸流程 數據在傳輸過程中&#xff0c;從上層逐層封裝到底層&#xff0c;最終通過物理介質發送。封裝與傳輸的具體流程如下&#xff1a; 封裝過程&#xff08;從IP層到物理層&#xff09; IP層&#xf…

Deeplizard深度學習課程(七)—— 神經網絡實驗

前言我們正在利用pytorch實現CNN。主要分為四個小部分&#xff1a;數據預處理、神經網絡pytorch設計、訓練神經網絡 和 神經網絡實驗。在之前的章節中&#xff0c;我們已經完成了整個CNN框架的設計、訓練與簡單分析&#xff0c;本節將更進一步討論神經網絡處理過程中的細節問題…

STM32實踐項目(激光炮臺)

剛開始設想做一個上半部分可以上下180移動,下半部分底座360移動的激光炮臺。于是便開始了實踐。 所需材料清單: 序號 名稱 數量 備注說明 1 面包板(Breadboard) 2 用于電路搭建和模塊連接 2 杜邦線(公對公、公對母等) 若干 建議準備 30~50 根,方便連接 3 MB-102 電源模塊…

不止是夾住,更是“感知”:Contactile GAL2觸覺型夾爪實現自適應抓取

近日&#xff0c;專注于觸覺傳感與智能抓取技術的Contactile推出全新Contactile 觸覺型夾爪 GAL2&#xff0c;這款集成先進傳感技術的雙指夾爪&#xff0c;憑借實時觸覺反饋能力&#xff0c;為多行業智能抓取場景帶來突破性解決方案。 Contactile 觸覺型夾爪GAL2是一款多功能即…

Grafana - 監控磁盤使用率Variables使用

1 查詢prometheus2 編輯grafana dashboard 2.1 配置變量2.2 配置多選2.3 配置legend2.4 優化顯示 1 查詢prometheus 指標名稱描述node_filesystem_size_bytes文件系統總容量node_filesystem_avail_bytes用戶可用空間node_filesystem_files_free剩余inode數量比如我們想看/目…