0695 岛屿的最大面积
给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。经典联通块问题。
static int temp;
public static int maxAreaOfIsland(int[][] grid) {
if (grid==null||grid.length==0){
return 0;
}
int answer=0;
int visited[][]= new int[grid.length][grid[0].length];
for (int i = 0; i < grid.length ; i++) {
for (int j = 0; j < grid[0].length ; j++) {
if (grid[i][j]==1&&visited[i][j]==0){
temp=0;
dfs(grid,visited,i,j);
answer=Math.max(answer,temp);
}
}
}
return answer;
}
public static void dfs(int grid[][], int [][]visited,int i, int j){
if (grid[i][j]==1&&visited[i][j]==0){
temp++;
visited[i][j]=1;
if (isVaild(grid,i+1,j)){
dfs(grid,visited,i+1,j);
}
if (isVaild(grid,i-1,j)){
dfs(grid,visited,i-1,j);
}
if (isVaild(grid,i,j+1)){
dfs(grid,visited,i,j+1);
}
if (isVaild(grid,i,j-1)){
dfs(grid,visited,i,j-1);
}
}
}
public static boolean isVaild(int grid[][], int i, int j){
if (i>=0&&i<=grid.length-1&&j>=0&&j<=grid[0].length-1){
return true;
}
return false;
}
0200 岛屿数量
给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。经典联通块问题。
public static int numIslands(char[][] grid) {
if (grid.length==0||grid==null){
return 0;
}
int answer=0;
int visited[][]= new int[grid.length][grid[0].length];
for (int i = 0; i < grid.length ; i++) {
for (int j = 0; j < grid[0].length ; j++) {
if (grid[i][j]=='1'&&visited[i][j]==0){
dfs(grid,visited,i,j);
answer++;
}
}
}
return answer;
}
public static void dfs(char grid[][], int visited[][],int i, int j){
if (grid[i][j]=='1'&&visited[i][j]==0){
visited[i][j]=1;
if (isVaild(grid,i+1,j)){
dfs(grid,visited,i+1,j);
}
if (isVaild(grid,i-1,j)){
dfs(grid,visited,i-1,j);
}
if (isVaild(grid,i,j+1)){
dfs(grid,visited,i,j+1);
}
if (isVaild(grid,i,j-1)){
dfs(grid,visited,i,j-1);
}
}
}
public static boolean isVaild(char grid[][], int i, int j){
if (i>=0&&i<=grid.length-1&&j>=0&&j<=grid[0].length-1){
return true;
}
return false;
}
0547 朋友圈
给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i] [j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。
public static int findCircleNum(int[][] M) {
int count=0;
int visited[]= new int[M.length];
for (int i = 0; i < M.length ; i++) {
if (visited[i]==0){
dfs(M,visited,i);
count++;
}
}
return count;
}
public static void dfs(int [][]M, int visited[], int i){
if (visited[i]==0){
visited[i]=1;
for (int j = 0; j < M[0].length; j++) {
if (M[i][j]==1){
dfs(M,visited,j);
}
}
}
}
0130 被围绕的区域
给定一个二维的矩阵,包含 'X'
和 'O'
(字母 O)。找到所有被 'X'
围绕的区域,并将这些区域里所有的 'O'
用 'X'
填充。
public static void solve(char[][] board) {
if (board == null || board.length == 0) return;
int visited[][]= new int[board.length][board[0].length];
for (int i = 0; i < board.length ; i++) {
for (int j = 0; j < board[0].length ; j++) {
if (board[i][j]=='O'&&isEdge(board,i,j)&&visited[i][j]==0){
dfs(i,j,board,visited);
}
}
}
for (int i = 0; i < board.length ; i++) {
for (int j = 0; j < board[0].length; j++) {
if (visited[i][j]==0){
board[i][j]='X';
}
}
}
}
public static void dfs(int i, int j, char[][]board, int [][]visited){
if (board[i][j]=='O'&&visited[i][j]==0){
visited[i][j]=1;
// System.out.println();
if (isVaild(board,i+1,j)){
dfs(i+1,j,board,visited);
}
if (isVaild(board,i-1,j)){
dfs(i-1,j,board,visited);
}
if (isVaild(board,i,j-1)){
dfs(i,j-1,board,visited);
}
if (isVaild(board,i,j+1)){
dfs(i,j+1,board,visited);
}
}
}
public static boolean isEdge(char[][]board, int i, int j){
if (i==0||i==board.length-1||j==0||j==board[0].length-1){
return true;
}
return false;
}
public static boolean isVaild(char grid[][], int i, int j){
if (i>=0&&i<=grid.length-1&&j>=0&&j<=grid[0].length-1){
return true;
}
return false;
}