classSolution:ISLAND_MARK=1def_is_in_boundary(self,row_index:int,column_index:int)->bool:if(row_index<self._row_numandrow_index>=0)and \(column_index<self._column_numandcolumn_index>=0):returnTruereturnFalsedef_get_island_size(self,grid:List[List[int]],visited:List[List[int]],group_id:int,row_index:int,column_index:int)->int:# [ up, down, left, right]four_directions=[(0,-1),(0,1),(-1,0),(1,0)]queue=[]island_size=1queue.append((row_index,column_index))whilequeue:row_index,column_index=queue.pop(0)visited[row_index][column_index]=group_idfordirectioninfour_directions:next_row_index=row_index+direction[1]next_col_index=column_index+direction[0]ifself._is_in_boundary(next_row_index,next_col_index):is_part_island=grid[next_row_index][next_col_index]==Solution.ISLAND_MARKis_visited=visited[next_row_index][next_col_index]!=-1ifis_part_islandandnotis_visited:island_size+=1visited[next_row_index][next_col_index]=group_idqueue.append((next_row_index,next_col_index))returnisland_sizedef_get_max_island_size(self,grid:List[List[int]],visited:List[List[int]],group_id_island_count_map:Dict[int,int],row_index:int,column_index:int)->int:# [ up, down, left, right]four_directions=[(0,-1),(0,1),(-1,0),(1,0)]island_size=1group_ids=[]fordirectioninfour_directions:next_row_index=row_index+direction[1]next_col_index=column_index+direction[0]ifself._is_in_boundary(next_row_index,next_col_index):is_part_island=grid[next_row_index][next_col_index]==Solution.ISLAND_MARKifis_part_island:group_id=visited[next_row_index][next_col_index]group_ids.append(group_id)# using set() to make sure, not to add same group id more than onceforgroup_idinset(group_ids):island_size+=group_id_island_count_map[group_id]returnisland_sizedeflargestIsland(self,grid:List[List[int]])->int:self._row_num=len(grid)self._column_num=len(grid[0])visited=[[-1]*self._column_numfor_inrange(self._row_num)]group_id=1group_id_island_count_map={}# will be runnning BFS to explore islands.forrow_indexinrange(self._row_num):forcolumn_indexinrange(self._column_num):ifgrid[row_index][column_index]==1andvisited[row_index][column_index]==-1:island_size=self._get_island_size(grid,visited,group_id,row_index,column_index)group_id_island_count_map[group_id]=island_sizegroup_id+=1max_island_size=-1# now searching for max island sizeforrow_indexinrange(self._row_num):forcolumn_indexinrange(self._column_num):ifgrid[row_index][column_index]==0:max_island_size=max(max_island_size,self._get_max_island_size(grid,visited,group_id_island_count_map,row_index,column_index))ifmax_island_size==-1:# it means there is no zero in the grid, so the whole grid is the islandmax_island_size=self._row_num*self._column_numreturnmax_island_size