二维矩阵的reshape实现(C++)

问题

在这里插入图片描述

方法

class Solution {
public:
    vector<vector<int>> matrixReshape(vector<vector<int>>& mat, int r, int c) {
    int m=mat.size();
    int n=mat[0].size();
    if (m*n != r*c) {
            return mat;
        }
    vector<vector<int>> mat2(r,vector<int>(c,0));
    for (int k=0; k<m*n;k++){
        mat2[k/c][k%c] = mat[k/n][k%n];
    }
    return mat2;
    }
};

反思

想到的方法和官方答案一样,即矩阵重塑时,使用的双下标与元素数i、列数c有关:

  • 第i个元素的行数是(i - 1)/c,当元素从k=0开始遍历时为k/c
  • 第i个元素的列数是(i%c)- 1,当元素从k=0开始遍历时为k%c
  • 还有一个新需要注意的点是,在for语句之前都没有用过的变量,可以在if之后for之前声明,在进入if语句时,就不需要开辟不必要的空间了,但是在if和else语句之间则不可以
  • 此外注意二维vector的声明方法vector<vector<int>> mat2(r,vector<int>(c,0));表示为r个vector<int>(c,0)其中是c个0(俄罗斯套娃操作
  • 这里对二维vector直接循环下标操作赋值了mat2[k/c][k%c] = mat[k/n][k%n];因为答主发现在这些情况下iterator迭代器、push_back、insert属实不好用。。。但是需要注意的是下标只能用于获取已存在的元素,因此在初始化时本人创建了r*c的全0矩阵
  • 最后一个注意的小点是if中m*n != r*c,这里是为了在不满足矩阵约束时返回原矩阵,一开始本人为了简洁,写为了n == c,认为原矩阵元素数目是一定的,只要列数相等就是原矩阵了(隐含了行数的约束),但是被现实狠狠地打了脸,好吧,不够鲁棒,谁知道用户会不会无数行列式的约束瞎输入呢???所以保险起见,以后的防止出问题的if约束还是细节一些吧= =不要用隐含约束!!!
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值