Preguntas sobre el pincel LeetCode: matriz

matriz de rotación

tema

Gire una matriz 2D 90 grados en el sentido de las agujas del reloj sin utilizar espacio adicional
Enlace

tren de pensamiento

Primero intercambie los elementos de la matriz de izquierda a derecha, y luego intercambie a lo largo de la diagonal

class Solution {
    
    
    public void rotate(int[][] matrix) {
    
    
        int len = matrix.length;
        if (len == 1) {
    
    
            return;
        }
        for (int i = 0; i < len; i++) {
    
    
            for (int j = 0; j < len / 2; j++) {
    
    
                swap(matrix, i, j, i, len - j - 1);
            }
        }
        for (int i = 0; i < len; i++) {
    
    
            for (int j = 0; j < len - i; j++) {
    
    
                swap(matrix, i, j, len - j - 1, len - i -1);
            }
        }
    }

  	// 交换矩阵中的两个元素
    private void swap(int[][] matrix, int x1, int y1, int x2, int y2) {
    
    
        int tmp = matrix[x1][y1];
        matrix[x1][y1] = matrix[x2][y2];
        matrix[x2][y2] = tmp;
    }
}

Matriz espiral (imprimir matriz en el sentido de las agujas del reloj)

tema

Obtenga los elementos de la matriz en el sentido de las agujas del reloj y devuelva un
enlace de lista

tren de pensamiento

Defina cuatro líneas divisorias arriba, abajo, izquierda y derecha. Cuando se completa una línea o columna, la línea divisoria correspondiente se moverá. Cuando las dos líneas divisorias chocan, significa que el recorrido ha terminado.

class Solution {
    
    
    public List<Integer> spiralOrder(int[][] matrix) {
    
    
        int rows = matrix.length;
        int cols = matrix[0].length;
      	// 定义上、左、右、下四条分割线
        int below = 0, left = 0, right = cols - 1, bottom = rows - 1;
        List<Integer> list = new ArrayList<>();
        while (true) {
    
    
          	// 从左到右遍历
            for (int i = left; i <= right; i++) {
    
    
                list.add(matrix[below][i]);
            }
            if (below++ == bottom) {
    
    
                break;
            }
          	// 从上到下遍历
            for (int i = below; i <= bottom; i++) {
    
    
                list.add(matrix[i][right]);
            }
            if (right-- == left) {
    
    
                break;
            }
          	// 从右到左遍历
            for (int i = right; i >= left; i--) {
    
    
                list.add(matrix[bottom][i]);
            }
            if (bottom-- == below) {
    
    
                break;
            }
          	// 从下到上遍历
            for (int i = bottom; i >= below; i--) {
    
    
                list.add(matrix[i][left]);
            }
            if (left++ == right) {
    
    
                break;
            }
        }
        return list;
    }
}

caminos en la matriz

tema

Dado un tablero de cuadrícula de caracteres bidimensionales mxn y una palabra de cadena. Devuelve verdadero si la palabra existe en la cuadrícula; de lo contrario, devuelve falso.

Las palabras deben formarse alfabéticamente, a través de letras en celdas adyacentes, donde las celdas "adyacentes" son aquellas que están adyacentes horizontal o verticalmente. No se permite el uso repetido de letras en la misma celda.

Enlace

tren de pensamiento

Recorrido en profundidad primero, pruebe cada elemento de la matriz en cuatro direcciones: arriba, abajo, izquierda y derecha

class Solution {
    
    
    public boolean exist(char[][] board, String word) {
    
    
        char[] words = word.toCharArray();
        for (int i = 0; i < board.length; i++) {
    
    
            for (int j = 0; j < board[0].length; j++) {
    
    
                if (dfs(board, words, i, j, 0)) {
    
    
                    return true;
                }
            }
        }
        return false;
    }
	
	// k记录成功匹配的字母个数
    private boolean dfs(char[][] board, char[] words, int i, int j, int k) {
    
    
    	// 数组越界或当前字符不在目标字符串内,直接返回false
        if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || board[i][j] != words[k]) {
    
    
            return false;
        }
        if (words.length == k + 1) {
    
    
            return true;
        }
        // 更改值表示当前位置已访问过
        board[i][j] = '\0';
        boolean res = dfs(board, words, i + 1, j, k + 1) || dfs(board, words, i - 1, j, k + 1) || dfs(board, words, i, j + 1, k + 1) || dfs(board, words, i, j - 1, k + 1);
        // 恢复为初始值
        board[i][j] = words[k];
        return res;
    }
}

Buscar matriz 2D

tema

Determine si hay un valor objetivo en la matriz bidimensional, la matriz se incrementa para cada fila y
el enlace se incrementa para cada columna

tren de pensamiento

Cada vez que compare el valor en la esquina superior derecha de la matriz con el valor objetivo, si el valor es mayor que el valor objetivo, significa que el valor objetivo está en la fila; si el valor es menor que el valor objetivo, excluya la fila actual y repita hasta encontrar el valor objetivo

class Solution {
    
    
    public boolean searchMatrix(int[][] matrix, int target) {
    
    
        int row = matrix.length;
        int col = matrix[0].length;
        int r = 0, c = col - 1;
        while (r < row && c >= 0) {
    
    
            if (matrix[r][c] == target) {
    
    
                return true;
            } else if (matrix[r][c] > target) {
    
    
                c--;
            } else {
    
    
                r++;
            }
        }
        return false;
    }
}

puesta a cero matricial

tema

Dada una matriz bidimensional, si un elemento es 0, todos los elementos en la fila y columna correspondientes deben cambiarse a 0; modifique el
enlace de la matriz en su lugar

tren de pensamiento

Atravesando todos los elementos de la matriz excepto la primera fila y la primera columna, si un elemento es 0, cambie el valor de la posición correspondiente de la primera fila y la primera columna a 0, lo que equivale a una marca, que indica la fila y columna correspondientes. Cambios posteriores debe cambiarse a 0; pero es posible que la primera fila y la primera columna ya tengan 0, lo que entrará en conflicto con la marca, por lo que la primera fila y la primera columna deben recorrerse primero, y se usan dos variables booleanas para registrar la primera fila y la primera fila. Si una columna debe ponerse a cero

class Solution {
    
    
    public void setZeroes(int[][] matrix) {
    
    
    	// 记录第一行和第一列是否要置为0
        boolean rowZero = false;
        boolean colZero = false;
        int i = 0, j = 0;
        for (i = 0; i < matrix[0].length; i++) {
    
    
            if (matrix[0][i] == 0) {
    
    
                rowZero = true;
                break;
            }
        }
        for (j = 0; j < matrix.length; j++) {
    
    
            if (matrix[j][0] == 0) {
    
    
                colZero = true;
                break;
            }
        }
        for (i = 1; i < matrix.length; i++) {
    
    
            for (j = 1; j < matrix[0].length; j++) {
    
    
            	// 若某元素为0,将第一行和第一列的对应位置置为0,相当于标记
                if (matrix[i][j] == 0) {
    
    
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
        for (i = 1; i < matrix.length; i++) {
    
    
            for (j = 1; j < matrix[0].length; j++) {
    
    
            	// 根据标记对相应的行和列置零
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
    
    
                    matrix[i][j] = 0;
                }
            }
        }
        // 根据布尔变量决定第一行和第一列是否置零
        if (rowZero) {
    
    
            for (i = 0; i < matrix[0].length; i++) {
    
    
                matrix[0][i] = 0;
            }
        }
        if (colZero) {
    
    
            for (j = 0; j < matrix.length; j++) {
    
    
                matrix[j][0] = 0;
            }
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/wzc3614/article/details/129570411
Recomendado
Clasificación