Даны, м, что означает строку и столбец матрицы 2D и массив пару A (размер K). Первоначально 2D матрица всего 0, что означает есть только море в матрице. Пара список имеет к оператору, и каждый оператор имеет два целочисленных А [я] .x, A [я] .y означает, что вы можете изменить матрицу сетки [A [я] .x] [A [я] .y] из море на остров. Возвращение сколько острова есть в матрице после каждого оператора.
пример
Пример 1:
Input: n = 4, m = 5, A = [[1,1],[0,1],[3,3],[3,4]]
Output: [1,1,2,2]
Explanation:
0. 00000
00000
00000
00000
1. 00000
01000
00000
00000
2. 01000
01000
00000
00000
3. 01000
01000
00000
00010
4. 01000
01000
00000
00011
Анализ: а также изучить проблемные наборы. Если соседи (сверху, снизу, слева, и существует) острова, должно быть объединена.
/ ** * Определение для точки. * Класс точка { * INT х; * INT у; * Точка () {х = 0; у = 0; } * Точка (Int А, Int б) {х = а; у = Ь; } *} * / Общественного класса Решение { / ** * @param п: целое число * @param м: целое число * @param операторы: массив точки * @return : целочисленный массив * / общественный List <Integer> numIslands2 ( INT п, ИНТ м, точка [] операторы) { Список<Целое число> Рез = новый ArrayList <> (); если (операторы == NULL || operators.length == 0 ) { возвращение Рез; } INT [] = карта новый INT [Н * м]; // 记录родитель INT CNT = 0; // 当前岛屿数 INT [] [] = {каталоги {-1, 0}, {1, 0}, {0, -1}, {0, 1 }}; для ( INT = 0; г <Н * м; я ++ ) { карта [I] = -1 ; } Для (точка р: операторы) { Int* = т + индекс PX Py; // Я первая фракция, то оставили о я приписывал всю правую дверь IF (Map [индекс] == -1) { // Check Point уже IF остров карта [индекс] = индекс; CNT ++ ; // найти четыре направления для ( INT I = 0; I <dirs.length; I ++ ) { INT X = PX + [I каталоги] [0]; ИНТ Y = Py + каталоги [I] [. 1 ]; INT nIndex = т + X * Y; ЕСЛИ (Х <0 || Х> = У п- || <|| 0 Y> = т || Карта [nIndex] == -1 ) { продолжить ; } INT nRoot = FindRoot (nIndex, карта); INT корень = FindRoot (индекс, карта); если (! nRoot = корень) { карта [nRoot] = корень; CNT - ; } } } Res.add (НСТ); } Вернуть Рез; } Частного ИНТ FindRoot ( INT я, ИНТ [] карты) { если (я ==карта [я]) { вернуться I; } Вернуть FindRoot (карта [I], карта); } }