全文目录
🎁主要知识点
矩阵乘法
📓课后习题
面试题 01.08. 零矩阵
📑写在最后
今天是c语言基础打卡的第35天,主要内容是矩阵的操作,希望大家能够理解呢,我就给大家记一下重点,给点课后题提示0.0。
相关链接:
【第35题】给定两个 a X b 和 c X d 的矩阵 ,求两个矩阵的乘积
🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
⏳全文大约阅读时间: 10min
🎁主要知识点
矩阵乘法
三重循环冲,就是模拟矩阵乘法的规则
void multiplyMatrix(int a, int b, int matA[maxn][maxn], int c, int d, int matB[maxn][maxn], int matRet[maxn][maxn]) { // assert(b == c); int i, j, k; for(i = 0; i < a; ++i) { for(j = 0; j < d; ++j) { matRet[i][j] = 0; for(k = 0; k < b; ++k) { matRet[i][j] += matA[i][k] * matB[k][j]; // 矩阵乘法的计算规则 } } } }
📓课后习题
面试题 01.08. 零矩阵
面试题 01.08. 零矩阵
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
解题思路
为了节约空间,可以利用第一行和第一列元素进行标记此行是否清零。为了第一列的元素能确定是否需要清零,可以用一个变量进行标记。
同时,为了防止第一行元素过早被污染,转换元素的时候最后再处理第一行。
void setZeroes(int** matrix, int matrixSize, int* matrixColSize){ int m = matrixSize,n = matrixColSize[0];//记录行列值 bool flag_col0 = false; for(int i = 0;i < m;++i){ //更新第一行第一列所有元素作为标记 if(!matrix[i][0]) flag_col0 = true; //记录第一列是否有0元素 for(int j = 1;j < n; ++j){ //从第第二行开始更新第一行和第一列元素 if(!matrix[i][j]) matrix[i][0] = matrix[0][j] = 0; } } for(int i = m - 1; i >= 0; --i){//从最最后一行开始更新元素 防止覆盖 因为第一行为标记元素 for(int j = 1;j < n;++j){ if((!matrix[i][0]) || (!matrix[0][j]))//有标记需要变成0 matrix[i][j] = 0; } if(flag_col0) matrix[i][0] = 0; } }