一.数组(24)

566. 重塑矩阵

在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。

给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。

重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。

如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

提示:

m == mat.length
n == mat[i].length
1 <= m, n <= 100
-1000 <= mat[i][j] <= 1000
1 <= r, c <= 300

我的代码:

func matrixReshape(mat [][]int, r int, c int) [][]int {
    m, n := len(mat), len(mat[0])
    if m * n > r * c{
        return mat
    }else{
        if m <= r && n <= c{
            return mat
        }else{
            k, l := 0, 0
            ans := make([][]int, r)
            for i := 0; i < r; i++{
                ans[i] = make([]int, c)
            } 
            for i := 0; i < m; i++{
            for j := 0; j < n; j++{
                    if l == c{
                        k++
                        l = 0
                    }
                    ans[k][l] = mat[i][j]
                    l++
                }
            }
            return ans
        }
    }
    
}

 

官方题解:

方法一:二维数组的一维表示
思路与算法

对于一个行数为 m,列数为 n,行列下标都从 0 开始编号的二维数组,我们可以通过下面的方式,将其中的每个元素 (i, j) 映射到整数域内,并且它们按照行优先的顺序一一对应着 [0, mn) 中的每一个整数。形象化地来说,我们把这个二维数组「排扁」成了一个一维数组。如果读者对机器学习有一定了解,可以知道这就是 flatten 操作。

这样的映射即为:
(i,j)→i×n+j

同样地,我们可以将整数 x 映射回其在矩阵中的下标,即
i=x / n
j=x % n
 

其中 /表示整数除法,% 表示取模运算。

那么题目需要我们做的事情相当于:

将二维数组nums 映射成一个一维数组;

将这个一维数组映射回 r 行 c 列的二维数组。

我们当然可以直接使用一个一维数组进行过渡,但我们也可以直接从二维数组nums 得到 r 行 c 列的重塑矩阵:

设nums 本身为 m 行 n 列,如果mn ≠rc,那么二者包含的元素个数不相同,因此无法进行重塑;

否则,对于 x∈[0,mn),第 x 个元素在 nums 中对应的下标为(x / n,x % n),而在新的重塑矩阵中对应的下标为 (x / c,x % c)。我们直接进行赋值即可。

 

 

官方代码:

func matrixReshape(nums [][]int, r int, c int) [][]int{
    n, m := len(nums), len(nums[0])
    if n * m != r * c{
        return nums
    }
    ans := make([][]int, r)
    for i := range ans{
        ans[i] = make([]int, c)
    }
    for i := 0; i < m * n; i++{
        ans[i / c][i % c] = nums[i / m][i % m]
    }
    return ans
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会回答你的问题。 首先,让我们来看看如何在C语言中完成数组的基本操作。 ①创建数组 在C语言中,可以通过以下语句来创建一个数组: ```c int arr[10]; // 创建一个包含10个整数的数组 ``` 这将创建一个名为arr的整数数组,它有10个元素。 ②显示数组 要显示数组中的元素,可以使用循环语句遍历数组并输出每个元素的值: ```c int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (int i = 0; i < 10; i++) { printf("%d ", arr[i]); } // 输出:1 2 3 4 5 6 7 8 9 10 ``` 这将输出数组中的每个元素。 ③矩阵乘法(应用) 现在让我们来看看如何使用数组进行矩阵乘法。 假设我们有两个矩阵A和B,它们的维度分别为n x m和m x p。我们可以通过以下方式计算它们的乘积C: ```c int A[n][m]; // 定义矩阵A int B[m][p]; // 定义矩阵B int C[n][p]; // 定义矩阵C // 初始化矩阵A和B for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { A[i][j] = i * j; } } for (int i = 0; i < m; i++) { for (int j = 0; j < p; j++) { B[i][j] = i + j; } } // 计算矩阵乘积 for (int i = 0; i < n; i++) { for (int j = 0; j < p; j++) { C[i][j] = 0; for (int k = 0; k < m; k++) { C[i][j] += A[i][k] * B[k][j]; } } } // 输出矩阵C for (int i = 0; i < n; i++) { for (int j = 0; j < p; j++) { printf("%d ", C[i][j]); } printf("\n"); } // 输出: // 0 0 0 // 3 4 5 // 6 8 10 // 9 12 15 // 12 16 20 // 15 20 25 // 18 24 30 // 21 28 35 // 24 32 40 // 27 36 45 ``` 这将计算矩阵A和B的乘积,并将结果存储在矩阵C中。然后,它将输出矩阵C的所有元素。 希望这个答案能够帮助你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值