305. Number of Islands II
题目:
A 2d grid map of m
rows and n
columns is initially filled with water. We may perform an addLand operation which turns the water at position (row, col) into a land. Given a list of positions to operate, count the number of islands after each addLand operation. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example:
Given m = 3, n = 3
, positions = [[0,0], [0,1], [1,2], [2,1]]
.
Initially, the 2d grid grid
is filled with water. (Assume 0 represents water and 1 represents land).
0 0 0
0 0 0
0 0 0
Operation #1: addLand(0, 0) turns the water at grid[0][0] into a land.
1 0 0
0 0 0 Number of islands = 1
0 0 0
Operation #2: addLand(0, 1) turns the water at grid[0][1] into a land.
1 1 0
0 0 0 Number of islands = 1
0 0 0
Operation #3: addLand(1, 2) turns the water at grid[1][2] into a land.
1 1 0
0 0 1 Number of islands = 2
0 0 0
Operation #4: addLand(2, 1) turns the water at grid[2][1] into a land.
1 1 0
0 0 1 Number of islands = 3
0 1 0
We return the result as an array: [1, 1, 2, 3]
Challenge:
Can you do it in time complexity O(k log mn), where k is the length of the positions
?
链接: http://leetcode.com/problems/number-of-islands-ii/
题解:
又是一道Union Find的经典题。这道题代码主要参考了yavinci大神。风格还是princeton Sedgewick的那一套。这里我们可以把二维的Union-Find映射为一维的Union Find。使用Quick-Union就可以完成。但这样的话Time Complexity是O(kmn)。 想要达到O(klogmn)的话可能还需要使用Weighted-Quick Union配合path compression。二刷一定要实现。
Time Complexity - O(mn * k), Space Complexity - O(mn)
public class Solution {
int[][] directions = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}}; public List<Integer> numIslands2(int m, int n, int[][] positions) {
List<Integer> res = new ArrayList<>();
if(m < 0 || n < 0 || positions == null) {
return res;
}
int[] id = new int[m * n]; // union find array
int count = 0;
Arrays.fill(id, -1); for(int i = 0; i < positions.length; i++) {
int index = n * positions[i][0] + positions[i][1];
if(id[index] != -1) {
res.add(count);
continue;
} id[index] = index;
count++; for(int[] direction : directions) {
int x = positions[i][0] + direction[0];
int y = positions[i][1] + direction[1];
int neighborIndex = n * x + y;
if(x < 0 || x >= m || y < 0 || y >= n || id[neighborIndex] == -1) {
continue;
}
if(!connected(id, index, neighborIndex)) {
union(id, neighborIndex, index);
count--;
}
} res.add(count);
}
return res;
} private boolean connected(int[] id, int p, int q) {
return id[p] == id[q];
} private void union(int[] id, int p, int q) {
int pid = id[p];
int qid = id[q];
for(int i = 0; i < id.length; i++) {
if(id[i] == pid) {
id[i] = qid;
}
}
}
}
二刷:
加入了Path compression以及Weight, 速度快了不少。
Time Complexity - (k * logmn) Space Complexity - O(mn), 这里k是positions的长度
public class Solution {
private int[] id;
private int[] sz;
private int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
public List<Integer> numIslands2(int m, int n, int[][] positions) {
List<Integer> res = new ArrayList<>();
if (positions == null || positions.length == 0 || m < 0 || n < 0) {
return res;
}
id = new int[m * n];
sz = new int[m * n];
for (int i = 0; i < id.length; i++) {
id[i] = i;
} int count = 0;
for (int[] position : positions) {
int p = position[0] * n + position[1];
sz[p]++;
count++;
for (int[] direction : directions) {
int newRow = position[0] + direction[0];
int newCol = position[1] + direction[1];
if (newRow < 0 || newCol < 0 || newRow > m - 1 || newCol > n - 1) {
continue;
}
int q = newRow * n + newCol;
if (sz[q] > 0) {
if (isConnected(p, q)) {
continue;
} else {
union(p, q);
count--;
}
}
}
res.add(count);
}
return res;
} private int getRoot(int p) {
while (p != id[p]) {
id[p] = id[id[p]];
p = id[p];
}
return p;
} private boolean isConnected(int p, int q) {
return getRoot(p) == getRoot(q);
} private void union(int p, int q) {
int rootP = getRoot(p);
int rootQ = getRoot(q);
if (rootP == rootQ) {
return;
} else {
if (sz[p] < sz[q]) {
id[rootP] = rootQ;
sz[q] += sz[p];
} else {
id[rootQ] = rootP;
sz[p] += sz[q];
}
}
}
}
Reference:
https://leetcode.com/discuss/69392/python-clear-solution-unionfind-class-weighting-compression
https://www.cs.princeton.edu/~rs/AlgsDS07/01UnionFind.pdf
https://leetcode.com/discuss/69397/my-simple-union-find-solution
https://leetcode.com/discuss/69572/easiest-15ms-java-solution-written-mins-with-explanations
https://leetcode.com/discuss/69585/union-find-java-implements
https://leetcode.com/discuss/69374/solution-using-union-find-path-compression-weight-balancing
https://leetcode.com/discuss/70392/java-union-find-solution
https://leetcode.com/discuss/72435/share-my-java-union-find-solution
https://leetcode.com/discuss/69513/simple-python-not-normal-union-find
http://algs4.cs.princeton.edu/15uf/
305. Number of Islands II的更多相关文章
- [LeetCode] 305. Number of Islands II 岛屿的数量之二
A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...
- LeetCode 305. Number of Islands II
原题链接在这里:https://leetcode.com/problems/number-of-islands-ii/ 题目: A 2d grid map of m rows and n column ...
- [LeetCode] 305. Number of Islands II 岛屿的数量 II
A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...
- [LeetCode] Number of Islands II 岛屿的数量之二
A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...
- [LeetCode] Number of Islands II
Problem Description: A 2d grid map of m rows and n columns is initially filled with water. We may pe ...
- Leetcode: Number of Islands II && Summary of Union Find
A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...
- [Swift]LeetCode305. 岛屿的个数 II $ Number of Islands II
A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...
- LeetCode – Number of Islands II
A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...
- LintCode "Number of Islands II"
A typical Union-Find one. I'm using a kinda Union-Find solution here. Some boiler-plate code - yeah ...
随机推荐
- js之Function原型
在ECMAScript中,Function(函数)类型实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象 ...
- Android -- 系统信息(内存、cpu、sd卡、电量、版本)获取
内存(ram) android的总内存大小信息 ...
- nodejs笔记三--url处理、Query String;
URL--该模块包含用以 URL 解析的实用函数. 使用 require('url') 来调用该模块. 一.parse函数的基础用法 parse函数的作用是解析url,返回一个json格式的数组,请看 ...
- django构建blog--页面部分(eclipse+pydev)
本文介绍的是在eclipse+pydev 平台下,利用django 搭建blog的第2部分:页面部分(主要涉及3个部分:模板.视图.URL模式) 篇幅1:创建模板 blog目录下新建一个文件夹:tem ...
- 05.Hibernate多对多关联
前言:本文讲解使用Hibernate映射多对多关联关系,并使用多种方式映射多对多关联. 1.数据库表的多对多关系 本文根据学生信息表(tb_student)和教师信息表(tb_teac ...
- Codeforces Round #277.5 (Div. 2)
题目链接:http://codeforces.com/contest/489 A:SwapSort In this problem your goal is to sort an array cons ...
- Noip2008双栈排序
[问题描述] 用两个栈使一个1...n的排列变得有序.一共有四个操作: A.stack1.push() 读入一个放入栈一 B.stack1.pop() 弹出栈一放入输出序列 C.stack2.push ...
- in_array函数的第三个参数 strict
看段代码 <?php $array = array('testing',0,'name'); var_dump($array); var_dump(in_array('foo', $array) ...
- no module named firefly.master.master
因为没有安装firefly python setup.py install
- ZOJ 3555 Ice Climber(dp)
晦涩的题意+各种傻逼害我调了那么久,实际上题目就是一个dp[i][j],dp[i][j]表示第i层第j个最少需要多少时间,当我们去更新dp[i][j]的时候,考虑的是从第i+1层的某一个dp[i+1] ...