问题
方法
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约束还是细节一些吧= =不要用隐含约束!!!