力扣 200 岛屿数量
public class numIslands_1 {
private int res;
public int numIslands(char[][] grid) {
res = 0;
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
if(grid[i][j] == '1'){
dfs(grid, i , j);
res ++;
}
}
}
return res;
}
private void dfs(char[][] grid, int i, int j) {
if(i >= grid.length || j >= grid[0].length || i < 0 || j < 0){
return;
}
if(grid[i][j] != '1'){
return ;
}
grid[i][j] = '2';
dfs(grid, i-1,j);
dfs(grid, i+1,j);
dfs(grid, i,j-1);
dfs(grid, i,j+1);
}
}
力扣 695 岛屿的最大面积
class Solution {
public int maxAreaOfIsland(int[][] grid) {
int res = 0;
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
int cur = dfs(i, j , grid);
res = Math.max(cur, res);
}
}
return res;
}
public int dfs(int i, int j, int[][] nums){
if(i < 0 || i >= nums.length || j < 0 || j >= nums[0].length){
return 0;
}
if(nums[i][j] != 1){
return 0;
}
nums[i][j] = 2;
return 1 + dfs(i - 1, j, nums)
+ dfs(i, j - 1, nums)
+ dfs(i + 1, j , nums)
+ dfs(i, j + 1, nums);
}
}
力扣827 最大人工岛
class Solution {
public static int largestIsland(int[][] grid) {
int res = 0, idx = 2;
HashMap<Integer, Integer> map = new HashMap<>();
if(grid == null || grid.length == 0) return 1;
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
if(grid[i][j] == 1){
int area = dfs(grid, i, j, idx);
map.put(idx ++, area);
res = Math.max(res, area);
}
}
}
if(res == 0) return 1;
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
if(grid[i][j] == 0){
HashSet<Integer> set = new HashSet<>();
getNeighbor(grid, i, j, set);
int cur = 1;
if(set.size() < 1) continue;
for(Integer setItem : set){
cur += map.get(setItem);
}
res = Math.max(res, cur);
}
}
}
return res;
}
private static void getNeighbor(int[][] grid, int i, int j, HashSet<Integer> set) {
if(i - 1 >= 0 && grid[i-1][j] != 0){
set.add(grid[i-1][j]);
}
if(j - 1 >= 0 && grid[i][j-1] != 0){
set.add(grid[i][j-1]);
}
if(i + 1 < grid.length && grid[i+1][j] != 0){
set.add(grid[i+1][j]);
}
if(j + 1 < grid[0].length && grid[i][j+1] != 0){
set.add(grid[i][j+1]);
}
}
private static int dfs(int[][] grid, int i, int j, int idx) {
if(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length) return 0;
if(grid[i][j] == 1) {
grid[i][j] = idx;
return 1 + dfs(grid, i - 1, j, idx)
+ dfs(grid, i + 1, j, idx)
+ dfs(grid, i, j - 1, idx)
+ dfs(grid, i, j + 1, idx);
}else{
return 0;
}
}
}
力扣 463岛屿的周长
class Solution {
public int islandPerimeter(int[][] grid) {
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
if(grid[i][j] == 1){
return dfs(grid, i, j);
}
}
}
return 0;
}
public int dfs(int[][] grid, int i, int j){
if(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length){
return 1;
}
if(grid[i][j] == 0){
return 1;
}
if(grid[i][j] == 2){
return 0;
}
grid[i][j] = 2;
return dfs(grid, i-1, j) +
dfs(grid, i+1, j) +
dfs(grid, i, j-1) +
dfs(grid, i, j+1);
}
}