LeetCode 566重塑矩阵 指针操作理解笔记
题目来源: 力扣题库(LeetCode) 566. 重塑矩阵
前言:
本来刚看到题目的时候,我是很开心的,这题不就是把二维数组“排扁”成一维数组,然后再排列成一个新的二维数组嘛!关键就是把一维数组重新映射回二维数组的关系式,这个我熟!(OS:终于有道名副其实的简单题了)但是LeetCode给出的待补充函数里一堆一级二级指针、还要涉及动态内存分配,属实把我整沉默了TAT,再翻翻官方给出的答案,凡是跟指针有关的我貌似是一句都看不懂呐(╯‵□′)╯︵┻━┻
一览题目
- 重塑矩阵
在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
示例 1:
输入:mat = [[1,2],[3,4]], r = 1, c = 4
输出:[[1,2,3,4]]
示例 2:
输入:mat = [[1,2],[3,4]], r = 2, c = 4
输出:[[1,2],[3,4]]
提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 100
-1000 <= mat[i][j] <= 1000
1 <= r, c <= 300
一览代码
/**
* 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().
*/
int** matrixReshape(int** mat, int matSize, int* matColSize, int r, int c, int* returnSize, int** returnColumnSizes){
int n = matColSize[0];
int m = matSize;
if(r * c != m * n)
{
*returnColumnSizes = matColSize;
*returnSize = matSize;
return mat;
}
int **ans = malloc(sizeof(int *) * r);
*returnColumnSizes = malloc(sizeof(int) * r);
*returnSize = r;
for(int i = 0; i < r; i ++)
{
(*returnColumnSizes)[i] = c;
ans[i] = malloc(sizeof(int) * c);
}
for(int i = 0; i < m * n; i ++)
{
ans[i / c][i % c] = mat[i / n][i % n];
}
return ans;
}
对各个参数的理解
对于
int** matrixReshape(int** mat, int matSize, int* matColSize, int r, int c, int* returnSize, int** returnColumnSizes)
其中:
mat
为整型的二级指针,是原始矩形(二维数组)
matSize
为整型变量,是矩阵的行数
matColSize
为整型变量,是矩形的列数
r
为整型变量,是重塑矩形的行数
c
为整型变量,是重塑矩形的列数
returnSize
为整型的一级指针
returnColumnSizes
为整型的二级指针,是重塑矩形各行的列数(一维数组)(不是都一样吗?LeetCode莫名奇妙的数据要求???)
对指针操作的理解
通过声明一个二级指针,开辟一个二维数组
//声明二级指针部分
int **ans = malloc(sizeof(int *) * r);
//循环开辟二维数组部分
for(int i = 0; i < r; i ++)
{
(*returnColumnSizes)[i] = c;//这条下面再讲(*^_^*)、
/*
开辟出容量为c个int的内存,将其首地址赋给ans[i]
*/
ans[i] = malloc(sizeof(int) * c);
}
二级指针指向一级指针所在的内存,解引用得到一级指针指向的变量所在的内存。
声明部分
中,开辟出r
个int
指针,这r
个指针的内存是连续的。那么malloc
返回的是在连续内存上的这r
个int
指针的首地址。将其赋给ans
后,我们得到了一个一维指针数组,完成了二维数组开辟中行的创建!
问题来咯:这时候可以将整型赋值给数组了吗?其实只要将单个整型变量的地址赋给每个一级指针,那么我们就得到一个一维数组啦
标签:int,ans,矩阵,566,重塑,数组,returnColumnSizes,LeetCode,指针 From: https://www.cnblogs.com/yousa/p/16827898.html