題目
在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;
}