leedcode:最大人工岛

题目:

给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。

返回执行此操作后,grid 中最大的岛屿面积是多少?

岛屿 由一组上、下、左、右四个方向相连的 1 形成

class Solution {
    public int largestIsland(int[][] grid) {
        
		
		Map mapIndexLand=new HashMap();
		//陆地的编号
		int index=2;
        //先标记出岛屿
		//循环行
        for(int i=0;i indexSet = obtainNeighbourIndex(grid, i, j, mapIndexLand);
        			
        			Iterator iterator = indexSet.iterator();
        			int area=1;
        			while(iterator.hasNext()) {
        				area+=mapIndexLand.getOrDefault(iterator.next(), 0);
        			}
        			
        			maxArea=Math.max(maxArea, area);
        		}
        	}

        }
        if(maxArea==0&&mapIndexLand.keySet().size()==1) {//说明全是陆地没有海洋
        	maxArea=mapIndexLand.get(index-1);
        }        
        return maxArea;
    }
	
	
	/**
	 * 标记并获取面积
	 * @param grid
	 * @param row
	 * @param cell
	 * @param index
	 * @return
	 */
	public int landArea(int[][] grid,int row,int cell,int index) {
		//校验,是否超出边界或者是海洋
		if(!inArea(grid,row,cell)) {
			return 0;
		}
		
		//判断是否访问过,防止进入死循环
		if(grid[row][cell]!=1) {
			return 0;
		}
		grid[row][cell]=index;
		
		return 1+
				landArea(grid,row-1,cell,index)+
				landArea(grid,row+1,cell,index)+
				landArea(grid,row,cell-1,index)+
				landArea(grid,row,cell+1,index);
		
	}
	
	/**
	 * 判断是否超界
	 * @param grid
	 * @param row
	 * @param cell
	 * @return
	 */
	public Boolean inArea(int[][] grid,int row,int cell) {
		
		return row>=0&&cell>=0&&row obtainNeighbourIndex(int[][] grid,int row,int cell,Map mapIndexLand) {
		
		Set indexSet=new HashSet();
		//校验,是否超出边界或者是海洋
		if(inArea(grid,row-1,cell)) {
			indexSet.add(grid[row-1][cell]);
		}
		if(inArea(grid,row+1,cell)) {
			indexSet.add(grid[row+1][cell]);
		}
		if(inArea(grid,row,cell-1)) {
			indexSet.add(grid[row][cell-1]);
		}
		if(inArea(grid,row,cell+1)) {
			indexSet.add(grid[row][cell+1]);
		}
		
		
		return indexSet;
		
	}
}

你可能感兴趣的:(算法,java)