LeetCode 695. 島嶼的最大面積(C、C++、python)
阿新 • • 發佈:2018-12-16
給定一個包含了一些 0 和 1的非空二維陣列 grid
, 一個 島嶼 是由四個方向 (水平或垂直) 的 1
(代表土地) 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。
找到給定的二維陣列中最大的島嶼面積。(如果沒有島嶼,則返回面積為0。)
示例 1:
[[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’。
示例 2:
[[0,0,0,0,0,0,0,0]]
對於上面這個給定的矩陣, 返回 0
。
注意: 給定的矩陣grid
的長度和寬度都不超過 50。
C
void DFS(int** tmp,int row,int col,int* area,int m,int n) { (*area)++; tmp[row][col]=2; if(row-1>=0 && 1==tmp[row-1][col]) { DFS(tmp,row-1,col,area,m,n); } if(row+1<=m-1 && 1==tmp[row+1][col]) { DFS(tmp,row+1,col,area,m,n); } if(col-1>=0 && 1==tmp[row][col-1]) { DFS(tmp,row,col-1,area,m,n); } if(col+1<=n-1 && 1==tmp[row][col+1]) { DFS(tmp,row,col+1,area,m,n); } } int maxAreaOfIsland(int** grid, int gridRowSize, int gridColSize) { int m=gridRowSize; int n=gridColSize; if(0==m || 0==n) { return 0; } int area=0; int res=0; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(1==grid[i][j]) { DFS(grid,i,j,&area,m,n); res=res>area?res:area; area=0; } } } return res; }
C++
class Solution { public: void DFS(vector<vector<int>>& tmp,int row,int col,int& area) { area++; tmp[row][col]=2; if(row-1>=0 && 1==tmp[row-1][col]) { DFS(tmp,row-1,col,area); } if(row+1<=tmp.size()-1 && 1==tmp[row+1][col]) { DFS(tmp,row+1,col,area); } if(col-1>=0 && 1==tmp[row][col-1]) { DFS(tmp,row,col-1,area); } if(col+1<=tmp[0].size()-1 && 1==tmp[row][col+1]) { DFS(tmp,row,col+1,area); } } int maxAreaOfIsland(vector<vector<int>>& grid) { if(grid.empty() || grid[0].empty()) { return 0; } int res=0; int area=0; int m=grid.size(); int n=grid[0].size(); for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(1==grid[i][j]) { DFS(grid,i,j,area); res=max(res,area); area=0; } } } return res; } };
C++法二
class Solution {
public:
int DFS(vector<vector<int>>& tmp,int row,int col,int area)
{
area++;
tmp[row][col]=2;
if(row-1>=0 && 1==tmp[row-1][col])
{
area=DFS(tmp,row-1,col,area);
}
if(row+1<=tmp.size()-1 && 1==tmp[row+1][col])
{
area=DFS(tmp,row+1,col,area);
}
if(col-1>=0 && 1==tmp[row][col-1])
{
area=DFS(tmp,row,col-1,area);
}
if(col+1<=tmp[0].size()-1 && 1==tmp[row][col+1])
{
area=DFS(tmp,row,col+1,area);
}
return area;
}
int maxAreaOfIsland(vector<vector<int>>& grid)
{
if(grid.empty() || grid[0].empty())
{
return 0;
}
int res=0;
int area=0;
int m=grid.size();
int n=grid[0].size();
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(1==grid[i][j])
{
area=DFS(grid,i,j,area);
res=max(res,area);
area=0;
}
}
}
return res;
}
};
python
class Solution:
def DFS(self,tmp,row,col,area):
tmp[row][col]=2
area+=1
if row-1>=0 and 1==tmp[row-1][col]:
area=self.DFS(tmp,row-1,col,area)
if row+1<=len(tmp)-1 and 1==tmp[row+1][col]:
area=self.DFS(tmp,row+1,col,area)
if col-1>=0 and 1==tmp[row][col-1]:
area=self.DFS(tmp,row,col-1,area)
if col+1<=len(tmp[0])-1 and 1==tmp[row][col+1]:
area=self.DFS(tmp,row,col+1,area)
return area
def maxAreaOfIsland(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
if []==grid or [[]]==grid:
return 0
m=len(grid)
n=len(grid[0])
res=0
area=0
for i in range(m):
for j in range(n):
if 1==grid[i][j]:
area=self.DFS(grid,i,j,area)
res=max(res,area)
area=0
return res