Likou 566. Remodelar la implementación del lenguaje Matrix-C: preguntas simples

tema

Portal

En MATLAB, hay una función de remodelación muy útil, que puede remodelar una matriz en otra matriz nueva con un tamaño diferente, pero conservar sus datos originales.
Dada una matriz representada por una matriz bidimensional y dos enteros positivos r y c, que representan el número de filas y columnas de la matriz reconstruida deseada, respectivamente.
La matriz reconstruida necesita llenar todos los elementos de la matriz original en el mismo orden transversal de fila.
Si la operación de remodelación con los parámetros dados es factible y razonable, se genera la nueva matriz de remodelación; de lo contrario, se genera la matriz original.

Ejemplo 1:

Entrada:
nums =
[[1,2],
[3,4]]
r = 1, c = 4
Salida:
[[1,2,3,4]]
Explicación:
El resultado de los números de recorrido de fila es [1,2 , 3, 4]. La nueva matriz es una matriz de 1 * 4, llene la nueva matriz línea por línea con los valores de los elementos anteriores.

Ejemplo 2:

Entrada:
nums =
[[1,2],
[3,4]]
r = 2, c = 4
Salida:
[[1,2],
[3,4]]
Explicación:
No hay forma de convertir un 2 * Matriz 2 en matriz 2 * 4. Así que genere la matriz original.

Nota:

给定矩阵的宽和高范围在 [1, 100]。
给定的 r 和 c 都是正数。

Fuente: LeetCode

Resolución de problemas

plantilla

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 * 返回一个大小为*returnSize的数组。
 *数组的大小以*returnColumnSizes数组的形式返回。
 *注意:返回的数组和*columnSizes数组必须是错置的,假设调用方调用free()
 */
int** matrixReshape(int** nums, int numsSize, int* numsColSize, int r, int c, int* returnSize, int** returnColumnSizes){
    
    
 
}

Analiza el significado de la pregunta.

Sabemos que el requisito del problema es realizar una transformación en la matriz bidimensional original que ingresamos y juzgar si se puede transformar en la matriz bidimensional requerida de r * c. Si es posible, genere los dos convertidos -matriz dimensional Si la conversión no es satisfactoria, se genera la matriz bidimensional original, por lo que debemos juzgar si la matriz original se puede convertir.

Codificación paso a paso

Inicializar para obtener el número de filas y columnas de la matriz original

    int m = numsSize;
    int n = numsColSize[0];

Después de obtenerlo, necesitamos juzgar la cantidad de elementos para determinar si se necesita la siguiente operación de conversión. Si m n = r c no se satisface , simplemente regrese a la matriz original directamente y realice una suma simple de la matriz original para returnSize y returnColumnSizes Sincronización.

    if (m * n != r * c) {
    
    
        *returnSize = numsSize;
        *returnColumnSizes = numsColSize;
        return nums;
    }

Si se satisface el número de elementos, continúe con la conversión
Primero, inicialice la nueva matriz r * c.

*returnSize = r;//r行
    *returnColumnSizes = malloc(sizeof(int) * r);//初始化分配内存并返回指向可使用的内存地址大小为r个整型数据
    int** ans = malloc(sizeof(int*) * r);//同上

    for (int i = 0; i < r; i++) {
    
    
        (*returnColumnSizes)[i] = c;//c列
        ans[i] = malloc(sizeof(int) * c);//为每一行的初始指向一可用的内存地址大小为c个整型数据
    }

Después de la inicialización, puede convertir entre las dos matrices; el
método de conversión es muy simple. Obtenemos las posiciones correspondientes de las dos a través de la división y el módulo. El
número total de elementos es m * n, y las filas y columnas también comienzan desde 0 Entonces x / n es la fila en la matriz bidimensional original, y x% n es la columna en la matriz bidimensional original. De la misma manera, x / c es la fila en la nueva matriz bidimensional y x% c es la columna en la nueva matriz bidimensional

    for (int x = 0; x < m * n; ++x) {
    
    
        ans[x / c][x % c] = nums[x / n][x % n];
    }

Finalmente regrese a ans

Código completo

int** matrixReshape(int** nums, int numsSize, int* numsColSize, int r, int c, int* returnSize, int** returnColumnSizes) {
    
    
    int m = numsSize;
    int n = numsColSize[0];
    if (m * n != r * c) {
    
    
        *returnSize = numsSize;
        *returnColumnSizes = numsColSize;
        return nums;
    }
    *returnSize = r;
    *returnColumnSizes = malloc(sizeof(int) * r);
    int** ans = malloc(sizeof(int*) * r);

    for (int i = 0; i < r; i++) {
    
    
        (*returnColumnSizes)[i] = c;
        ans[i] = malloc(sizeof(int) * c);
    }
    for (int x = 0; x < m * n; ++x) {
    
    
        ans[x / c][x % c] = nums[x / n][x % n];
    }
    return ans;
}

Supongo que te gusta

Origin blog.csdn.net/qq_44922487/article/details/113830870
Recomendado
Clasificación