Python Solution with explanation and comments
Tag islands and record the area of islands for initial grid.\nThen for each \'water\' position, combine its adjacent islands and return the largest.\n\n\nclass 
Tag islands and record the area of islands for initial grid.\nThen for each \'water\' position, combine its adjacent islands and return the largest.\n\n```\nclass Solution:\n    def largestIsland(self, grid):\n        if not grid or not grid[0]: return 0\n        m, n = len(grid), len(grid[0])\n        \n        island_tag = 100\n        visited = set()\n        # area for each island_tag\n        areas = collections.Counter()\n        \n        ret = 0\n        for i in range(m):\n            for j in range(n):\n                if grid[i][j]==0 or (i, j) in visited: continue\n                # increment to get new island_tag\n                island_tag += 1\n                visited.add((i, j))\n                q = [(i, j)]\n                while q:\n                    (x, y) = q.pop(0)\n                    # increment island area\n                    areas[island_tag] += 1\n                    ret = max(ret, areas[island_tag])\n                    # set grid[x][y] to the island_tag it belongs to\n                    grid[x][y] = island_tag\n                    for xx, yy in [(x+1, y), (x-1, y), (x, y+1), (x, y-1)]:\n                        if not (0<=xx<m and 0<=yy<n) or (xx, yy) in visited or grid[xx][yy]==0:\n                            continue\n                        visited.add((xx, yy))\n                        q.append((xx, yy))\n                        \n        for x in range(m):\n            for y in range(n):\n                if grid[x][y]!=0: continue\n                area = 1\n                islands = set()\n                # Combine its adjacent islands and sum up their area\n                for xx, yy in [(x+1, y), (x-1, y), (x, y+1), (x, y-1)]:\n                    if not (0<=xx<m and 0<=yy<n):\n                        continue\n                    islands.add(grid[xx][yy])\n                for island in islands:\n                    area += areas[island]\n                ret = max(ret, area)\n                \n        return ret\n```
[]