In a 2D grid of `0`s and `1`s, we change at most one `0` to a `1`.

After, what is the size of the largest island? (An island is a 4-directionally connected group of 1s).

Example 1:

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

Example 2:

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

Example 3:

Input: [[1, 1], [1, 1]]
Output: 4
Explanation: Can't change any 0 to 1, only one island with area = 4.

Notes:

  • 1 <= grid.length = grid[0].length <= 50.
  • 0 <= grid[i][j] <= 1.

这道题在只有0和1的矩阵中用相连的1来表示小岛,现在说是有一个把0变为1的机会,这样原本不相邻的岛就有可能变的相邻了,从而组成一个更大的岛,让求出可能组成的最大的岛屿的面积,也就是相连的1的个数。在 LeetCode 中关于岛屿的题其实也做过许多,比如 [Number of Distinct Islands II](http://www.cnblogs.com/grandyang/p/8542820.html),[Max Area of Island](http://www.cnblogs.com/grandyang/p/7712724.html),[Number of Distinct Islands](http://www.cnblogs.com/grandyang/p/7698778.html),[Number of Islands II](http://www.cnblogs.com/grandyang/p/5190419.html),和 [Number of Islands](http://www.cnblogs.com/grandyang/p/4402656.html)。其实大多题目的本质都是用 DFS 或者 BFS 去遍历所有相连的1,当然这道题也不例外。博主最开始的想法是首先用 DFS 来找出每个岛屿,然后把同一个岛屿的位置坐标都放到同一个 HashSet 中,这样就有了很多 HashSet,然后遍历所有的0的位置,对每个0位置,遍历其周围4个邻居,然后看邻居位置有没有属于岛屿的,有的话就把该岛屿的 HashSet 编号记录下来,遍历完4个邻居后,在把所有的相连的岛屿中的1个数加起来(因为 HashSet 可以直接求出集合中数字的总个数),每次更新结果 res 即可。这种方法是可以通过 OJ 的,速度还比下面展示的两种方法要快,就是代码比较长,没有下面方法的简洁,这里就不贴了。下面的这两种方法其实都是从每个0开始处理,先把0替换成1,然后再用 DFS 来找所有相连的1的个数,具体如何找就跟之前的岛屿的题目没啥区别了,这里就不细讲了,参见代码如下:


解法一:

class Solution {
public:
int largestIsland(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size(), res = 0;
bool hasZero = false;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (grid[i][j] == 1) continue;
grid[i][j] = 1;
vector<vector<bool>> visited(m, vector<bool>(n));
res = max(res, helper(grid, i, j, visited));
if (res == m * n) return res;
grid[i][j] = 0;
hasZero = true;
}
}
return hasZero ? res : m * n;
}
int helper(vector<vector<int>>& grid, int i, int j, vector<vector<bool>>& visited) {
int m = grid.size(), n = grid[0].size();
if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == 0 || visited[i][j]) return 0;
visited[i][j] = true;
return 1 + helper(grid, i - 1, j , visited) + helper(grid, i + 1, j , visited) + helper(grid, i, j - 1, visited) + helper(grid, i, j + 1, visited);
}
};

当然我们也可以用 BFS 来找所有相连的1的个数,整个的解题思路和上面的解法并没有什么不同,并不难理解,这可能就是论坛上会有人质疑这道题不应该标为 Hard 的原因,参见代码如下:


解法二:

class Solution {
public:
int largestIsland(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size(), res = 0;
bool hasZero = false;
vector<int> dirX{0, -1, 0, 1}, dirY{-1, 0, 1, 0};
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (grid[i][j] == 1) continue;
vector<vector<bool>> visited(m, vector<bool>(n));
queue<int> q{{i * n + j}};
int sum = 0;
while (!q.empty()) {
int t = q.front(); q.pop();
++sum;
for (int k = 0; k < 4; ++k) {
int x = t / n + dirX[k], y = t % n + dirY[k];
if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0 || visited[x][y]) continue;
visited[x][y] = true;
q.push(x * n + y);
}
}
res = max(res, sum);
if (res == m * n) return res;
hasZero = true;
}
}
return hasZero ? res : m * n;
}
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/827

类似题目:

Number of Distinct Islands II

Max Area of Island

Number of Distinct Islands

Number of Islands II

Number of Islands

参考资料:

https://leetcode.com/problems/making-a-large-island/

https://leetcode.com/problems/making-a-large-island/discuss/313787/Two-java-solutions

https://leetcode.com/problems/making-a-large-island/discuss/127256/DFS-JAVA-AC-CONCISE-SOLUTION

https://leetcode.com/problems/making-a-large-island/discuss/127015/C%2B%2B-O(n*m)-15-ms-colorful-islands

[LeetCode All in One 题目讲解汇总(持续更新中...)](https://www.cnblogs.com/grandyang/p/4606334.html)

[LeetCode] 827. Making A Large Island 建造一个巨大岛屿的更多相关文章

  1. [LeetCode] 827. Making A Large Island

    In a 2D grid of 0s and 1s, we change at most one 0 to a 1. After, what is the size of the largest is ...

  2. 【leetcode】827. Making A Large Island

    题目如下: 解题思路:这个题目可以进行拆分成几个子问题.第一,求出island的数量,其实就是 200. Number of Islands,这个很简单,DFS或者BFS都能搞定:第二,除了求出isl ...

  3. Leetcode之深度优先搜索(DFS)专题-695. 岛屿的最大面积(Max Area of Island)

    Leetcode之深度优先搜索(DFS)专题-695. 岛屿的最大面积(Max Area of Island) 深度优先搜索的解题详细介绍,点击 给定一个包含了一些 0 和 1的非空二维数组 grid ...

  4. [LeetCode] 496. Next Greater Element I 下一个较大的元素 I

    You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of n ...

  5. [LeetCode] 503. Next Greater Element II 下一个较大的元素 II

    Given a circular array (the next element of the last element is the first element of the array), pri ...

  6. [LeetCode] 556. Next Greater Element III 下一个较大的元素 III

    Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...

  7. Leetcode之深度优先搜索(DFS)专题-200. 岛屿数量(Number of Islands)

    Leetcode之深度优先搜索(DFS)专题-200. 岛屿数量(Number of Islands) 深度优先搜索的解题详细介绍,点击 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计 ...

  8. LeetCode 695. Max Area of Island (岛的最大区域)

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  9. [LeetCode] Search a 2D Matrix II 搜索一个二维矩阵之二

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

随机推荐

  1. ​LeetCode 26:删除排序数组中的重复项 Remove Duplicates from Sorted Array

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. Give ...

  2. HTML+css基础 css的几种形式

    1.行间样式:将style写在标签内的充当标签标签属性 2.行内样式

  3. SSM整合教程

    接着一直next下去 创建各个目录 pom.xml文件中引入各种包 <?xml version="1.0" encoding="UTF-8"?> & ...

  4. 修改 Oracle 数据库实例字符集

    Ø  简介 在 Oracle 中创建数据库实例后,就会有对应使用的编码字符集.当我们设置的字符集与操作系统或者其他软件字符集不一致时,就会出现个字符长度存储一个汉字. 2.   SIMPLIFIED ...

  5. dbvisualizer客户端执行创建存储过程或自定义函数语句的方法

    DBVisualizer这个数据库客户端工具,如果要执行存储过程或函数的话,需要在创建存储过程或函数的语句的最前面和末尾分别加上[--/]和[/]符号. --/ CREATE FUNCTION B22 ...

  6. 2019.10 搜索引擎最新排名,Elasticsearch遥遥领先

    大数据的搜索平台已经成为了众多企业的标配,Elasticsearch.Splunk(商业上市公司).Solr(Apache开源项目)是其中最为优秀和流行的选择.在2019.10 最新搜索引擎排名中,E ...

  7. Python - 正则表达式 - 第二十二天

    正则表达式 - 教程 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"). 正则表达式使用单 ...

  8. DesignPattern系列__07合成复用原则

    基本介绍 合成复用原则的核心,就是尽量去使用组合.聚合等方式,而不是使用继承. 核心思想 1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起. 2.针对接口编程,而不是 ...

  9. Vue笔记--同局域网下访问本地项目

    正常开发中有时间提测比较麻烦.通常让测试小姐姐连接开发本地开启的服务器访问本地项目(在同一局域网下). 其实一般项目IDE已经实现这些功能例如webstorm和vscode,有时候需要单独配置下. 但 ...

  10. MES系统如何帮助烟草行业管理生产流程

    与很多其他行业一样,烟草MES系统可以帮助卷烟企业实现智能生产.精益制造.快速实现烟草企业数字化车间的创建,助力企业实现改造升级,从而提升企业生产效率,降低生产成产.烟草行业得MES者得天下. 烟草行 ...