原題:
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/number-of-islands
給你一個由 '1'(陸地)和 '0'(水)組成的的二維網格,請你計算網格中島嶼的數量。
島嶼總是被水包圍,並且每座島嶼只能由水平方向或豎直方向上相鄰的陸地連接形成。
此外,你可以假設該網格的四條邊均被水包圍。
示例 1:
輸入:
11110
11010
11000
00000
輸出: 1
示例 2:
輸入:
11000
11000
00100
00011
輸出: 3
解釋: 每座島嶼只能由水平和/或豎直方向上相鄰的陸地連接而成。
解題思路:
我采用的方式類似於廣度遍歷的方式。如果該位置是 ‘1’ 則入隊,然后判斷其上下左右是否為 ‘1’ ,1入隊,0不操作。然后出隊。通過循環可以找到連接的島嶼。在入隊的同時將該位置重置為‘0’
具體代碼如下
public int numIslands(char[][] grid) { int num=0; for(int i=0;i<grid.length;i++){ for(int j=0;j<grid[i].length;j++){ if(grid[i][j]=='1'){ num++; Queue<String> queue=new LinkedList<String>(); queue.offer(i+";"+j); //起始節點入隊 ,根據角標設定 i;j 的格式,i為行,j為列入隊 grid[i][j]='0'; //該位置 重定為0 while(!queue.isEmpty()){ //開始廣度遍歷 String t=queue.peek(); //取隊頭 queue.poll(); //出隊 int hang=Integer.parseInt(t.split(";")[0]); //取出行數 int lie=Integer.parseInt(t.split(";")[1]); //取出列數
//判斷該點的上下左右 if(hang>0&&grid[hang-1][lie]=='1') {//上 queue.offer((hang - 1) + ";" + lie); grid[hang-1][lie]='0'; } if(hang<grid.length-1&&grid[hang+1][lie]=='1') {//下 queue.offer((hang + 1) + ";" + lie); grid[hang+1][lie]='0'; } if(lie>0&&grid[hang][lie-1]=='1') {//左 queue.offer(hang + ";" + (lie - 1)); grid[hang][lie - 1] = '0'; } if(lie<grid[0].length-1&&grid[hang][lie+1]=='1') {//右 queue.offer(hang + ";" + (lie + 1)); grid[hang][lie + 1] = '0'; } } } } } return num; }
PS:目前該解法時間復雜度和空間復雜度相對較高。
如有錯誤,歡迎指正。