JavaScript two simple solutions, but not the fastest ((
First: the idea is to check every zero in a grid, and its area size: \n\nvar largestIsland = function(grid) {    \n    let findArea = function(grid, area, i, j,
First: the idea is to check every zero in a grid, and its area size: \n```\nvar largestIsland = function(grid) {    \n    let findArea = function(grid, area, i, j, first){   \n        if (typeof grid[i] == \'undefined\' || typeof grid[i][j] == \'undefined\' || area[i+"."+j]) return 0;\n\n        if (grid[i][j] == 1 || first) {\n            area[i+"."+j] = true;\n            return 1 + \n                findArea(grid, area, i-1, j) + \n                findArea(grid, area, i+1, j) + \n                findArea(grid, area, i, j-1) +\n                findArea(grid, area, i, j+1) ;\n        }\n        \n        return 0;\n    }\n    \n    let max = 0;\n    for (let i =0; i < grid.length; i++) {\n        for (let j = 0; j < grid[0].length; j++) {\n            if (grid[i][j] == 0) {           \n                let size = findArea(grid, {}, i, j, true);\n                if (size > max) {\n                    max = size;\n                }\n            }\n        } \n    }\n    \n    return max ? max :  grid.length*grid[0].length\n};\n```\n\nSecond: the idea is to find all islands, then for each zero, we have to check is it connected to the island (much faster then first solution, but still not the best i think):\n\n```\nfunction Area(){\n    this.points = {};\n    \n    this.Size = 0;\n    this.Add = function(i,j){\n        if (!this.points[i]) this.points[i] = {};\n        this.points[i][j] = true;\n    }\n    \n    this.Get = function(i,j){\n        return (this.points[i] && this.points[i][j]) ? this.points[i][j] : 0;\n    }\n}\n\nvar largestIsland = function(grid) { \n    \n    let findArea = function(grid, area, i, j){   \n         if (typeof grid[i] == \'undefined\' || typeof grid[i][j] == \'undefined\' || area.Get(i,j)) return 0;\n            \n         if (grid[i][j] == 1) {\n            area.Add(i,j);\n            return 1 + \n                findArea(grid, area, i-1, j) + \n                findArea(grid, area, i+1, j) + \n                findArea(grid, area, i, j-1) +\n                findArea(grid, area, i, j+1) ;\n        }\n        \n        return 0;\n    }\n    \n    let areas = [];\n    let zeros = [];\n    \n    for (let i = 0; i < grid.length; i++) {\n       for(let j= 0; j < grid[0].length; j++){\n            if (grid[i][j] == 0) {\n                zeros.push([i,j]);\n                continue;\n            }\n           \n            let skip = false;\n            for (let a in areas) {\n                if (areas[a].Get(i,j)) {\n                    skip = true; break;\n                }\n            }\n\n            if (skip) continue;\n            \n            let area = new Area();\n            area.Size = findArea(grid, area, i, j);\n            areas.push(area);\n       }\n   }\n    \n    if (zeros.length == 0) return grid.length*grid[0].length\n    if (areas.length == 0) return 1;\n    \n    \n    let maxSize = 0;\n    for (let z = 0; z < zeros.length; z++) {\n        let i = zeros[z][0];\n        let j = zeros[z][1];\n        \n        let size = 1;\n        for (let n = 0; n < areas.length; n++) {\n            if (areas[n].Get(i+1, j) || areas[n].Get(i-1, j) || areas[n].Get(i, j+1) || areas[n].Get(i, j-1)) {\n                size+= areas[n].Size;\n            }\n        }\n        \n        if (size > maxSize) {\n            maxSize = size;\n        }\n    }\n    \n    return maxSize;\n}\n```\n\n
['JavaScript']