力扣566. 重塑矩陣-C語言實現-簡單題

清瀨灰二發表於2021-02-17

題目

傳送門

在MATLAB中,有一個非常有用的函式 reshape,它可以將一個矩陣重塑為另一個大小不同的新矩陣,但保留其原始資料。
給出一個由二維陣列表示的矩陣,以及兩個正整數r和c,分別表示想要的重構的矩陣的行數和列數。
重構後的矩陣需要將原始矩陣的所有元素以相同的行遍歷順序填充。
如果具有給定引數的reshape操作是可行且合理的,則輸出新的重塑矩陣;否則,輸出原始矩陣。

示例 1:

輸入:
nums =
[[1,2],
[3,4]]
r = 1, c = 4
輸出:
[[1,2,3,4]]
解釋:
行遍歷nums的結果是 [1,2,3,4]。新的矩陣是 1 * 4 矩陣, 用之前的元素值一行一行填充新矩陣。

示例 2:

輸入:
nums =
[[1,2],
[3,4]]
r = 2, c = 4
輸出:
[[1,2],
[3,4]]
解釋:
沒有辦法將 2 * 2 矩陣轉化為 2 * 4 矩陣。 所以輸出原矩陣。

注意:

給定矩陣的寬和高範圍在 [1, 100]。
給定的 r 和 c 都是正數。

來源:力扣(LeetCode)

解題

模板

/**
 * 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){
 
}

分析題意

我們已知題目的要求就是對於我們輸入的原二維陣列進行一個變換,判斷其是否能夠變換成要求的r*c的二維陣列,如果可以就輸出轉換後的二維陣列,轉換不成功就將原二維陣列輸出,所以我們需要對於原陣列是否能夠轉換進行判斷。

分步編碼

初始化得到原陣列的行數和列數

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

得到後我們需要進行元素個數判斷,來決定是否需要進行下一步的轉換操作,如果不滿足mn=rc,則直接返回原陣列即可,同時對於returnSize和returnColumnSizes進行一個簡單的和原陣列的同步。

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

如果滿足了元素個數合理就繼續轉換
首先對於新的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個整型資料
    }

初始化之後就可以對於兩個陣列之間進行轉化;
轉化方式很簡單我們通過除法和模運算得到兩者的對應位置
總元素個數是m*n個,行與列也都是從0開始的,所以x/n就是原二維陣列中的第幾行,x%n就是原二維陣列中的第幾列。同理,x/c就是新二維陣列中的第幾行,x%c就是新二維陣列中的第幾列

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

最後返回ans即可

完整程式碼

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;
}

相關文章