地址:
力扣https://leetcode-cn.com/problems/transpose-matrix/
题目:
给你一个二维整数数组 matrix
, 返回 matrix
的 转置矩阵 。
矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输入:matrix = [[1,2,3],[4,5,6]] |
提示:
m == matrix.length n == matrix[i].length 1 <= m, n <= 1000 1 <= m * n <= 105 -109 <= matrix[i][j] <= 109 |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/transpose-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
按照题意分配一个二维数组,然后互换 [i][j] <->[j][i](有坑)
示例举得示例是对称的,还有非对称的需要自己手动找下规律
以 2*4 大小矩阵为例子,互换完成后应该是 4*2 大小矩阵
[0][0] [0][1] [0][2] [0][3] [0][0] [1][0] [2][0] [3][0]
[1][0] [1][1] [1][2] [1][3] ----> [0][1] [1][1] [2][1] [3][1]
方式一、分配二维数组,互换位置
int **myMalloc(int r, int c, int *return_r, int **return_c)
{
int **ret = (int **)malloc(sizeof(int *) * r);
*return_r = r;
*return_c =(int *)malloc(sizeof(int) * r);
for(int i=0; i<r; i++)
{
ret[i] = (int *)malloc(sizeof(int) * c);
(*return_c)[i] = c;
}
return ret;
}
/**
* 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** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes){
// int r = matrixSize;
// int c = matrixColSize[0];
int c = matrixSize;
int r = matrixColSize[0];
int **ret = myMalloc(r, c, returnSize, returnColumnSizes);
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
ret[i][j] = matrix[j][i];
}
}
return ret;
}
结束语:
针对二维数组的分配我们做了一个通用模板
int **myMalloc(int r, int c, int *return_r, int **return_c)
{
int **ret = (int **)malloc(sizeof(int *) * r);
*return_r = r;
*return_c =(int *)malloc(sizeof(int) * r);
for(int i=0; i<r; i++)
{
ret[i] = (int *)malloc(sizeof(int) * c);
(*return_c)[i] = c;
}
return ret;
}
输入值:r | 创建数组的行数 |
输入值:c | 创建数组的列数 |
输出值:*return_r | 返回数组的行数,供caller使用 |
输出值:**return_c | 返回一位数组,数组元素代表每行有多少列 |
二维数组的理解通常都是比较烧脑的,这里特别细说一下
1. 创建一个二维数组,其实就是二维指针。
int **ret 的指向一定是一组长度(r 行)元素,每一个元素都是一个一维指针,指向一组数据(c 列)
指针变量 ret 指向一组长度为 r 的元素首地址 | ret[0] 指针 | 指向某个地址,存放 c 列元素 | [1,2,3,4] |
ret[1] 指针 | [5,6,7,8] | ||
... ... | .... .... | ||
ret[r-1] 指针 | [x,x,x,x] |
所以在定义 ret 时,我们首先要分配其包括的一维指针的空间
int **ret = (int **)malloc(sizeof(int *) * r);
每一个一维指针指向的元素也是需要空间存放的,所以
ret[i] = (int *)malloc(sizeof(int) * c);
2. 我们还需要给定返回值,供 caller 使用,可以看出参数是一个一维指针,预测 caller 使用 &x 把变量地址传入供修改
*return_r = r;
3. 最后一个参数也是返回值类型。我们需要返回一个一维数组,每个元素代表本次二维数组每一行代表多少列
我们的 function 肯定会对一个一维数组分配空间(c 列)
还需要返回这个一维数组的地址给 caller,caller就需要传入一个指向一维数组的指针,让我们的function去修改
**return_c 指向一维数组地址 | *return_c 指向一组空间 | 空间存放 c 列元素 |
我们的 function 需要分配一维指针指向的那组空间
*return_c =(int *)malloc(sizeof(int) * r);
这样就完成了创建二维数组的模板,后续相关创建部分就可以直接套用了。