swift LeetCode岛屿类问题
200. 岛屿数量
class Solution {
func numIslands(_ grid: [[Character]]) -> Int {
guard grid.count > 0 && grid[0].count > 0 else {
return -1
}
var res = grid
var count = 0
for i in 0..<res.count {
for j in 0..<res[0].count {
if res[i][j] == "1" {
dfs(&res, i, j)
count = count + 1
}
}
}
return count
}
func dfs(_ grid: inout [[Character]],_ r:Int,_ c:Int) -> Void {
if !inArea(grid, r, c) {
return// 判断 base case
}
if (grid[r][c] != "1") {
return;// 如果这个格子不是岛屿,直接返回
}
grid[r][c] = "2"; // 将格子标记为「已遍历过」
// 访问上、下、左、右四个相邻结点
dfs(&grid, r - 1, c);
dfs(&grid, r + 1, c);
dfs(&grid, r, c - 1);
dfs(&grid, r, c + 1);
}
// 判断坐标 (r, c) 是否在网格中
func inArea(_ grid: [[Character]],_ r:Int,_ c:Int) -> Bool {
return 0 <= r && r < grid.count
&& 0 <= c && c < grid[0].count;
}
}
- 岛屿的周长
class Solution {
func islandPerimeter(_ grid: [[Int]]) -> Int {
guard grid.count > 0 && grid[0].count > 0 else {
return -1
}
var res = grid
var count = 0
for i in 0..<res.count {
for j in 0..<res[0].count {
if res[i][j] == 1 {
return dfs(&res, i, j)
}
}
}
return count
}
func dfs(_ grid: inout [[Int]],_ r:Int,_ c:Int) -> Int {
if !inArea(grid, r, c) {
return 1
}
if (grid[r][c] == 0) {
return 1;
}
if (grid[r][c] != 1) {
return 0;
}
grid[r][c] = 2; // 将格子标记为「已遍历过」
// 访问上、下、左、右四个相邻结点
return dfs(&grid, r - 1, c)+dfs(&grid, r + 1, c)+dfs(&grid, r, c - 1)+dfs(&grid, r, c + 1)
}
// 判断坐标 (r, c) 是否在网格中
func inArea(_ grid: [[Int]],_ r:Int,_ c:Int) -> Bool {
return r >= 0 && r < grid.count
&& c >= 0 && c < grid[0].count;
}
}
- 岛屿的最大面积
class Solution {
func maxAreaOfIsland(_ grid: [[Int]]) -> Int {
guard grid.count > 0 || grid[0].count > 0 else {
return 0
}
var num = 0
var res = grid
for i in 0..<res.count {
for j in 0..<res[0].count {
if res[i][j] == 1 {
let a = dfs(&res,i,j)
num = max(a,num)
}
}
}
return num
}
func dfs(_ grid: inout [[Int]],_ i:Int,_ j:Int) -> Int {
if(!inArea(grid,i,j)) {
return 0
}
if grid[i][j] != 1 {
return 0
}
grid[i][j] = 2
return 1+dfs(&grid,i-1,j)+dfs(&grid,i,j-1)+dfs(&grid,i+1,j)+dfs(&grid,i,j+1)
}
func inArea(_ grid: [[Int]],_ i:Int,_ j:Int) -> Bool {
return i>=0&&i<grid.count&&j>=0&&j<grid[0].count
}
}
原文地址:https://blog.csdn.net/langyuejing/article/details/114993562
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。