[LeetCode] Количество островов II

Даны, м, что означает строку и столбец матрицы 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], карта); 
    } 

}

 

рекомендация

отwww.cnblogs.com/yinger33/p/10961865.html