---
# System prepended metadata

title: '[LeetCode 827. Making A Large Island ](https://leetcode.com/explore/challenge/card/august-leetcoding-challenge-2021/613/week-1-august-1st-august-7th/3835/)'

---

# [LeetCode 827. Making A Large Island ](https://leetcode.com/explore/challenge/card/august-leetcoding-challenge-2021/613/week-1-august-1st-august-7th/3835/)
### Daily challenge Aug 1, 2021 (HARD)

>You are given an `n x n` binary matrix `grid`. You are allowed to change **at most one** `0` to be `1`.
>
>Return the size of the largest **island** in `grid` after applying this operation.
>
>An island is a 4-directionally connected group of 1s.


:::info
**Example 1:**
**Input:** grid = [[1,0],[0,1]]
**Output:** 3
**Explanation:** Change one 0 to 1 and connect two 1s, then we get an island with area = 3.
:::

:::info
**Example 2:**
**Input:** grid = [[1,1],[1,0]]
**Output:** 4
**Explanation:** Change the 0 to 1 and make the island bigger, only one island with area = 4.
:::

:::info
**Example 3:**
**Input:** grid = [[1,1],[1,1]]
**utput** 4
**Explanation:** Can't change any 0 to 1, only one island with area = 4.
:::


:::warning
**Constraints:**
* n == grid.length
* n == grid[i].length
* 1 <= n <= 500
* grid[i][j] is either 0 or 1.
:::

---



### Approach 1 : DFS :bulb: + :book: 
**`516 ms ( 71.61% )`** **`O(N^2)`**

* 步驟 : 
>1. 先判斷 `grid[x][y] == 1` ---> 使用 **`DFS`** 計算每塊 `island` 的大小，同時將 `island` 給上 **`group_label`**。
>2. 再判斷 `grid[x][y] == 0` 周圍是否有相連的 `island`。

* DFS : 
>* **`group_label`** 表示 `island` 組別。
>---> 從 `2` 開始編號 ( 因為 0、1 原本就存在 `grid` 裡面 )。
>**`group_area`** 表示每組 `island` 的 `area`。
>**`ans`** 代表當前最大的 `area`。
> 1. 往四個方向進行 **`DFS`**，尋找 `area`。
> 2. 將 `island`  的每個點賦予 `label` ---> **`grid[x][y] = gorup_label`**。
> 3. 最後將每組的 `area` 存入 `group_area` -> **`group_area[group_label] = dfs()`**。

* 判斷 `0` : 
> * **`unordered_set<int> used`** 紀錄當前 `0` 走過的 `island`。
> ---> 可以避免當前的 `0` 有多個方向與同一個 `island` 相連。
> * 當 **`grid[x][y] == 0`** : 
>> 1. 判斷四個方向是否有 `island` 相連。
>> ---> **`area += group_area[grid[next_x][next_y]]`**。
>> 2. 最後判斷新的 `area` 是否較大 ---> **`ans = max(ans, area)`**。


```cpp=1
class Solution {
public:
    int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    map<int, int> group_area;
    
    
    int dfs(vector<vector<int>>& grid, int x, int y, int group_label){
        int area = 0;
        grid[x][y] = group_label; // label each area by group
        
        for(auto DIR : dir){
            int next_x = x + DIR[0];
            int next_y = y + DIR[1];
            
            if(next_x < 0 || next_x >= grid.size() ||
               next_y < 0 || next_y >= grid[0].size())  continue;
            
            if(grid[next_x][next_y] == 1)   area += dfs(grid, next_x, next_y, group_label);
        }
        
        return area + 1;
    }
    
    
    int largestIsland(vector<vector<int>>& grid) {
        int ans = 0;
        int group_label = 2;  // start from 2, beacuase 0、1 is matrix's original number
        
        for(int i=0; i<grid.size(); i++){
            for(int j=0; j<grid[0].size(); j++){
                if(grid[i][j] == 1){
                    group_area[group_label] = dfs(grid, i, j, group_label);
                    ans = max(ans, group_area[group_label]);
                    group_label++;
                }
            }
        }
        
        
        for(int i=0; i<grid.size(); i++){
            for(int j=0; j<grid[0].size(); j++){
                if(grid[i][j] == 0){
                    unordered_set<int> used;
                    int area = 1;
                    for(auto DIR : dir){
                        int next_x = i + DIR[0];
                        int next_y = j + DIR[1];
                        
                        if(next_x < 0 || next_x >= grid.size() ||
                           next_y < 0 || next_y >= grid[0].size())   continue;
                        
                        group_label = grid[next_x][next_y];
                        
                        if(grid[next_x][next_y] > 1 && used.count(group_label) == 0){
                            area += group_area[grid[next_x][next_y]];
                            used.insert(group_label);
                        }
                    }
                    
                    ans = max(ans, area);
                }
            }
        }
        
        return ans;
    }
};
```