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

題目

傳送門數組

在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 矩陣, 用以前的元素值一行一行填充新矩陣。code

示例 2:內存

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

注意:get

給定矩陣的寬和高範圍在 [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進行一個簡單的和原數組的同步。class

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;
}
相關文章
相關標籤/搜索