力扣算法:島嶼數量


原題:

來源:力扣(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:目前該解法時間復雜度和空間復雜度相對較高。

如有錯誤,歡迎指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM