867. 转置矩阵

地址:

力扣icon-default.png?t=LBL2https://leetcode-cn.com/problems/transpose-matrix/

题目:

给你一个二维整数数组 matrix, 返回 matrix转置矩阵

矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[1,4,7],[2,5,8],[3,6,9]]
示例 2:

输入:matrix = [[1,2,3],[4,5,6]]
输出:[[1,4],[2,5],[3,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); 

这样就完成了创建二维数组的模板,后续相关创建部分就可以直接套用了。

查看更多刷题笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值