トピックの説明;
マトリックスには0と1の2つの値があります。各位置は、上、下、左、右の4つの位置に接続できます。1つのピースが1つのピースに接続されている場合、この部分は島。マトリックスにはいくつの島がありますか?
コードは次のように表示されます。
package demopacket;
import java.util.*;
public class Solution {
public static void main(String[] args) {
int[][] arr = {
{
0, 0, 1, 0, 1, 0},
{
1, 1, 1, 0, 1, 0},
{
1, 0, 0, 1, 0, 0},
{
0, 0, 0, 0, 0, 0}
};
int ans = countIslands(arr);
System.out.println(ans);
}
public static int countIslands(int[][] arr) {
if (arr == null || arr[0] == null) {
return 0;
}
int n = arr.length;
int m = arr[0].length;
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (arr[i][j] == 1) {
ans++;
infect(arr, i, j, n, m);
}
}
}
return ans;
}
public static void infect(int[][] arr, int i, int j, int n, int m) {
if (i < 0 || i >= n || j < 0 || j >= m || arr[i][j] != 1) {
return;
}
arr[i][j] = 2;//i,j没有越界,并且arr[i][j]为1,感染相邻的变为2
infect(arr, i + 1, j, n, m);
infect(arr, i - 1, j, n, m);
infect(arr, i, j + 1, n, m);
infect(arr, i, j - 1, n, m);
}
}
実施結果:3
695.島の最大のエリア
タイトル説明:
いくつかの0と1を含む空でない2次元配列グリッドが与えられます。島は、隣接する1(土地を表す)の組み合わせです。ここでの「隣接」という用語は、2つの1が水平または垂直に互いに隣接している必要があることを意味します。グリッドの4つのエッジすべてが0(水を表す)で囲まれていると想定できます。与えられた2次元配列で最大の島の領域を見つけます。(島がない場合、返される領域は0です。)
注:指定されたマトリックスグリッドの長さと幅は50を超えません。
例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が返されます。島には水平または垂直の4方向に1しか含めることができないため、答えは11であってはならないことに注意してください。
例2:
[[0,0,0,0,0,0,0,0]]
上記の行列の場合、0を返します。
コードは次のように表示されます。
class Solution {
public int maxAreaOfIsland(int[][] arr) {
if (arr == null || arr[0] == null) {
return 0;
}
int n = arr.length;
int m = arr[0].length;
int ans = 0;
int max = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (arr[i][j] == 1) {
List<Integer> list = new ArrayList<>();
infect(arr, i, j, n, m, list);
max = Math.max(max, list.size());
}
}
}
return max;
}
public static void infect(int[][] arr, int i, int j, int n, int m, List<Integer> list) {
if (i < 0 || i >= n || j < 0 || j >= m || arr[i][j] != 1) {
return;
}
arr[i][j] = 2;//i,j没有越界,并且arr[i][j]为1,感染相邻的变为2
if (arr[i][j] == 2) {
list.add(-1);
}
infect(arr, i + 1, j, n, m, list);
infect(arr, i - 1, j, n, m, list);
infect(arr, i, j + 1, n, m, list);
infect(arr, i, j - 1, n, m, list);
}
}
結果: