題目:
給定乙個包含了一些 0 和 1 的非空二維陣列 grid 。
乙個 島嶼 是由一些相鄰的 1 (代表土地) 構成的組合,這裡的「相鄰」要求兩個 1 必須在水平或者豎直方向上相鄰。你可以假設 grid 的四個邊緣都被 0(代表水)包圍著。
找到給定的二維陣列中最大的島嶼面積。(如果沒有島嶼,則返回面積為 0 。)
示例:
[[0,0,1,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,1,1,0,1,0,0,0,0,0,0,0,0],
[0,1,0,0,1,1,0,0,1,0,1,0,0],
[0,1,0,0,1,1,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0]]
對於上面這個給定矩陣應返回 6。注意答案不應該是 11 ,因為島嶼只能包含水平或垂直的四個方向的 1 。
分析:
要求的是最大的島嶼面積,這個面積是按照組成島嶼的1的個數來計算的,而相鄰的方向設定為水平和垂直。其實就是從某個值為1的點出發,從水平和垂直四個方向上向相鄰的點行走,可以最多路過多少個值為1的點。那我麼就可以利用深度優先遍歷演算法來解決:
dfs的演算法思想就是:從某一點出發,到達其某個鄰接點後,再從這個鄰接點出發,走向鄰接點的鄰接點,直到最終無路可走,然後再向上後退,走其他的鄰接點,繼續向下一直走,最終遍歷完所有的點為止。
那我們遍歷這個二維陣列,設定乙個訪問記錄陣列,記錄陣列中的點是否被訪問,訪問過的點就不能再訪問了,每遍歷到值為1的點時,它未被訪問過,那麼就從這個點出發,進行深度優先遍歷,計算它能遍歷的總的點的個數,再與當前最大值進行比較,如果比當前最大值大,那麼就替換當前最大值,否則繼續遍歷陣列中其他值為1的點。
對於二維陣列中的某一點(i,j),其可以走的方向有四個,可表示為:(1,0)、(-1,0)、(0,1)、(0,-1)
**:
public int maxareaofisland(int grid)
int col = grid[0].length;
int row = grid.length;
boolean isvisited = new boolean[row][col];
int max_res = 0;
for (int i = 0; i < row; i++) }}
return max_res;
}private int curareadbydfs(int grid,int r,int c,boolean isvisited),,,};
stack> stack = new stack<>();
int length = 1;
stack.push(new pair<>(r,c));
isvisited[r][c] = true;
while (!stack.isempty())
if (grid[nex_r][nex_c] == 1 && !isvisited[nex_r][nex_c])
}if (flag == 0)
}return length;
}
我採用的dfs演算法是通過非遞迴的形式實現的,借助於棧,實現dfs。設定變數flag的原因是為了通知何時可以將當前訪問的頂點壓出棧,我們遍歷當前頂點的相鄰點的時候,是從當前頂點的四個相鄰位置遍歷的,四個方向遍歷完畢時,如果未找到當前頂點可以繼續向下走的頂點,那麼說明此時這個頂點已經無路可走,那麼它也就沒有必要再留到棧裡面,而是向上返回到當前頂點的前一步頂點,遍歷其前一步頂點是否有路可走。
如果通過判斷方向選擇遍歷完畢來說明要壓出棧,是會出問題的,因為退出方向遍歷的for迴圈只有兩種可能:一是找到了鄰接點,二是遍歷完成了;但是這兩種可能有耦合到一起的可能,也就是在最後乙個方向的時候,找到了鄰接點,那麼此時就不能將棧頂元素壓出。
695 島嶼的最大面積
給定乙個包含了一些 0 和 1的非空二維陣列 grid 乙個 島嶼 是由四個方向 水平或垂直 的 1 代表土地 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為0。示例 1 0,0,1,0,0,0,0,1,0,0,0,0,0 0,0...
695 島嶼的最大面積
給定乙個包含了一些 0 和 1的非空二維陣列 grid 乙個 島嶼 是由四個方向 水平或垂直 的 1 代表土地 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為0。示例 1 0,0,1,0,0,0,0,1,0,0,0,0,0 0,0...
695 島嶼的最大面積
給定乙個包含了一些 0 和 1 的非空二維陣列 grid 乙個 島嶼 是由一些相鄰的 1 代表土地 構成的組合,這裡的 相鄰 要求兩個 1 必須在水平或者豎直方向上相鄰。你可以假設 grid 的四個邊緣都被 0 代表水 包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為 0 示例...