1. 程式人生 > >力扣566. 重塑矩陣-C語言實現-簡單題

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

## 題目 [傳送門](https://leetcode-cn.com/problems/reshape-the-matrix) >在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) ## 解題 ### 模板 ```c /** * 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的二維陣列,如果可以就輸出轉換後的二維陣列,轉換不成功就將原二維陣列輸出,所以我們需要對於原陣列是否能夠轉換進行判斷。 ### 分步編碼 #### 初始化得到原陣列的行數和列數 ```c int m = numsSize; int n = numsColSize[0]; ``` 得到後我們需要進行元素個數判斷,來決定是否需要進行下一步的轉換操作,如果不滿足m*n=r*c,則直接返回原陣列即可,同時對於returnSize和returnColumnSizes進行一個簡單的和原陣列的同步。 ```c if (m * n != r * c) { *returnSize = numsSize; *returnColumnSizes = numsColSize; return nums; } ``` 如果滿足了元素個數合理就繼續轉換 首先對於新的r*c陣列進行初始化 ```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就是新二維陣列中的第幾列 ```c for (int x = 0; x < m * n; ++x) { ans[x / c][x % c] = nums[x / n][x % n]; } ``` 最後返回ans即可 ### 完整程式碼 ```c 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; }