博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode 827. Making A Large Island
阅读量:6573 次
发布时间:2019-06-24

本文共 2899 字,大约阅读时间需要 9 分钟。

Problem:

 

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 island? (An island is a 4-directionally connected group of 1s).

Example 1:

Input: [[1, 0], [0, 1]]Output: 3Explanation: 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: 4Explanation: Change the 0 to 1 and make the island bigger, only one island with area = 4.

Example 3:

Input: [[1, 1], [1, 1]]Output: 4Explanation: 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.

 

Solution:

  Hard题中的easy题,首先用一个哈希表chunk用每个联通块根节点映射该联通块对应的大小,用Union Find即可,然后对于grid中每个值为0的位置,若其上下左右某个位置为1,则找到该位置对应的根节点,在chunk中找到其对于的联通块的大小,加到square中即可,注意有可能上下左右四个方位中的某些1是联通的,所以我在循环内部用了一个哈希集root记录了访问过的根节点避免重复相加联通块。注意边界即可。

Code:

 

1 class Solution { 2 public: 3     int Find(vector
&parent,int target){ 4 while(parent[target] != target){ 5 target = parent[target]; 6 } 7 return target; 8 } 9 void Union(vector
&parent,int x,int y){10 int px = Find(parent,x);11 int py = Find(parent,y);12 if(px == py) return;13 if(px < py) 14 parent[py] = px;15 else 16 parent[px] = py;17 }18 int largestIsland(vector
>& grid) {19 int m = grid.size();20 int n = grid[0].size();21 vector
parent(m*n,0);22 vector
> dir({ { 0,1},{ 0,-1},{ 1,0},{-1,0}});23 for(int i = 0;i != m*n;++i){24 parent[i] = i;25 }26 for(int i = 0;i != m;++i){27 for(int j = 0;j != n;++j){28 if(grid[i][j] == 0) continue;29 for(int k = 0;k != dir.size();++k){30 if(i+dir[k][0] < 0 || i+dir[k][0] >= m || j+dir[k][1] < 0 || j+dir[k][1] >= n)31 continue;32 if(grid[i+dir[k][0]][j+dir[k][1]] == 1)33 Union(parent,i*n+j,(i+dir[k][0])*n+j+dir[k][1]);34 }35 }36 }37 int maximal = 0;38 unordered_map
chunk;39 for(int i = 0;i != m;++i){40 for(int j = 0;j != n;++j){41 if(grid[i][j] == 0) continue;42 int root = Find(parent,i*n+j);43 chunk[root]++;44 maximal = max(maximal,chunk[root]);45 }46 }47 for(int i = 0;i != m;++i){48 for(int j = 0;j != n;++j){49 if(grid[i][j] == 1) continue;50 int square = 1;51 unordered_set
root;52 for(int k = 0;k != dir.size();++k){53 if(i+dir[k][0] < 0 || i+dir[k][0] >= m || j+dir[k][1] < 0 || j+dir[k][1] >= n)54 continue;55 if(grid[i+dir[k][0]][j+dir[k][1]] == 1){56 int r = Find(parent,(i+dir[k][0])*n+j+dir[k][1]);57 if(root.find(r) == root.end()){58 root.insert(r);59 square += chunk[r];60 }61 }62 }63 maximal = max(maximal,square);64 }65 }66 return maximal;67 }68 };

 

转载于:https://www.cnblogs.com/haoweizh/p/10322485.html

你可能感兴趣的文章
WPF and Silverlight 学习笔记(十二):WPF Panel内容模型、Decorator内容模型及其他...
查看>>
FLUSH TABLES WITH READ LOCK 和 LOCK TABLES比较
查看>>
MySQL:创建、修改和删除表
查看>>
Java多线程程序设计详细解析
查看>>
IOS 7 Study - UISegmentedControl
查看>>
八、通用类型系统
查看>>
JQuery的ajaxFileUpload的使用
查看>>
Java分享笔记:使用keySet方法获取Map集合中的元素
查看>>
Java面向对象练习题之人员信息
查看>>
关于Integer类中parseInt()和valueOf()方法的区别以及int和String类性的转换.以及String类valueOf()方法...
查看>>
ios 控制器的生命周期
查看>>
C#动态代理
查看>>
使用 sessionStorage 创建一个本地存储的 name/value
查看>>
POJ2127 LICS模板
查看>>
Python笔记8----DataFrame(二维)
查看>>
JavaScript 特殊效果代码
查看>>
【?】codeforces721E Road to Home(DP+单调队列)
查看>>
MySQL 仅保留7天、一个月数据
查看>>
OGG 11g Checkpoint 详解
查看>>
PHP中使用socket通信响应速度慢的原因与解决办法
查看>>