[LintCode]NumberofIslands(島嶼個數)
描述
給一個01矩陣,求不同的島嶼的個數。
0代表海,1代表島,如果兩個1相鄰,那麼這兩個1屬於同一個島。我們只考慮上下左右為相鄰。
樣例
在矩陣:
[
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]
]
中有 3
個島。
程式碼
GitHub 的原始碼,請訪問下面的連結:
package com.ossez.lang.tutorial.tests.lintcode;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <p>
* 433
* <ul>
* <li>@see <a href=
* "https://www.cwiki.us/display/ITCLASSIFICATION/Number+of+Islands">https://www.cwiki.us/display/ITCLASSIFICATION/Number+of+Islands</a>
* <li>@see<a href="https://www.lintcode.com/problem/number-of-islands/">https://www.lintcode.com/problem/number-of-islands/</a>
* </ul>
* </p>
*
* @author YuCheng
*
*/
public class LintCode0433NumIslandsTest {
private final static Logger logger = LoggerFactory.getLogger(LintCode0433NumIslandsTest.class);
/**
*
*/
@Test
public void testMain() {
logger.debug("BEGIN");
// INIT GRID
boolean[][] grid = { { true, true, false, false, false }, { false, true, false, false, true }, { false, false, false, true, true },
{ false, false, false, false, false }, { false, false, false, false, true }
};
// NULL CHECK
if (grid.length == 0 || grid[0].length == 0) {
System.out.println("NULL");
// return 0;
}
// GET SIZE
int n = grid.length;
int m = grid[0].length;
// ARRAY FOR VISITED LOG
boolean[][] visited = new boolean[n][m];
int count = 0;
// LOOP FOR GRID
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] && !visited[i][j]) {
numIslandsDFS(grid, visited, i, j);
count++;
}
}
}
System.out.println(count);
}
/**
*
* @param grid
* @param visited
* @param x
* @param y
*/
public void numIslandsDFS(boolean[][] grid, boolean[][] visited, int x, int y) {
if (x < 0 || x >= grid.length) {
return;
}
if (y < 0 || y >= grid[0].length) {
return;
}
if (grid[x][y] != true || visited[x][y]) {
return;
}
visited[x][y] = true;
// Recursive call
numIslandsDFS(grid, visited, x - 1, y);
numIslandsDFS(grid, visited, x + 1, y);
numIslandsDFS(grid, visited, x, y - 1);
numIslandsDFS(grid, visited, x, y + 1);
}
}
點評
本質是求矩陣中連續區域的個數,很容易想到需要用深度優先搜尋 DFS 來解,我們需要建立一個 visited 陣列用來記錄某個位置是否被訪問過,對於一個為 true 且未被訪問過的位置,我們遞迴進入其上下左右位置上為 true 的數,將其 visited 對應值賦為 true,繼續進入其所有相連的鄰位置,這樣可以將這個連通區域所有的數找出來,並將其對應的 visited 中的值賦 true,找完次區域後,我們將結果 res 自增 1,然後我們在繼續找下一個為 true 且未被訪問過的位置,以此類推直至遍歷完整個原陣列即可得到最終結果。
這裡需要有一個遞迴的呼叫。在遞迴呼叫之前需要進行判斷是否超出邊際,如果超出邊際的話,就要跳出迴圈。
在一個節點進行遍歷的時候,需要在遞迴呼叫的時候,同時針對這個節點搜尋上下左右 4 個節點,如果找到需要了滿足條件的 true,就繼續查詢,如果沒有找到就退出。在這個過程的時候,需要將訪問過的節點儲存到訪問控制的 2 維陣列中。以便於在下次查詢的時候跳過這個節點。
https://www.cwiki.us/display/ITCLASSIFICATION/Number+of+Islands
相關文章
- 200. 島嶼數量
- 最大島嶼面積
- 程式碼隨想錄day52 || 圖論搜尋 島嶼數量,島嶼的最大面積圖論
- 有關Developer的島嶼理論Developer
- Leedcode-島嶼的周長
- LeetCode 463. 島嶼的周長 JAVALeetCodeJava
- 程式碼隨想錄演算法訓練營day51| 卡碼網99.島嶼數量 卡碼網100.島嶼的最大面積演算法
- 【力扣】島嶼數量(體會一下dfs和bfs思路的實質)力扣
- 我用演算法學golang(島嶼的最大面積)演算法Golang
- 程式碼隨想錄演算法訓練營 | 200.島嶼的數量(dfs/bfs)演算法
- 200、島嶼數量 | 演算法(leetcode,附思維導圖 + 全部解法)300題演算法LeetCode
- 我的島嶼我做主,沙盒經營建造遊戲《島與工廠》將於4月19日推出遊戲
- 菜鳥扣程式碼第九天:leetcode463--島嶼的周長LeetCode
- 【leetcode】劍指 Offer II 105. 島嶼的最大面積-【深度優先DFS】LeetCode
- Lintcode 反轉整數
- LintCode 刪除數字
- 《紀念碑谷》工作室的新作,讓你用相機修復島嶼上的大自然
- 領釦LintCode演算法問題答案-1225. 島的周長演算法
- LintCode 用遞迴列印數字遞迴
- 美五角大樓在廢棄島嶼展開針對電網的大型網路攻擊演習
- lintcode演算法題 落單的數 JavaScript演算法JavaScript
- Python判斷海域有多少個小島Python
- 迷失島
- 每日安全資訊:美五角大樓在廢棄島嶼展開針對電網的大型網路攻擊演習
- 【Lintcode】970. Big Business(配數學證明)
- 這是我的標題-森嶼白芷
- 青島數字貨幣交易系統開發核心
- 領釦LintCode演算法問題答案-1206. 下一個更大的數 I演算法
- [LintCode] Daily TemperaturesAI
- LintCode 子樹
- LintCode-Backpack
- LintCode-HeapifyAPI
- LintCode 刪除排序連結串列中的重複數字 II排序
- [LintCode] Permutation in String
- LintCode 主元素 II
- LintCode 解碼方法
- LintCode-Search for a Range
- LintCode-K Sum