☘前言☘
今天是九日集训第七天,我会记录一下学习内容和题解,争当课代表0.0.
链接:《算法零基础100讲》(第3讲) 矩阵
🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
⏳全文大约阅读时间: 20min
全文目录
☘前言☘
🎁主要知识点梳理
📝1.矩阵的定义
🍭2.矩阵的水平翻转
🍜3.矩阵的垂直翻转
🍡4.矩阵的顺时针旋转
🍛5.矩阵的逆时针旋转
🍣6.矩阵的逆时针转置
📓课后习题
1672. 最富有客户的资产总量
1582. 二进制矩阵中的特殊位置
832. 翻转图像
48. 旋转图像
867. 转置矩阵
2022. 将一维数组转变成二维数组
1886. 判断矩阵经轮转后是否一致
1260. 二维网格迁移
54. 螺旋矩阵
📑写在最后
🎁主要知识点梳理
📝1.矩阵的定义
矩阵Amxn 定义的是按照长方阵列排列的负数或者实数集合,其中n表示行数,m代表列数。入下图所示为一个4x3的矩阵
在c语言我们可以用二维数组A[n][m]代表一个nxm 矩阵,其中``A[i][j]代表第 i行,第j列元素。
🍭2.矩阵的水平翻转
矩阵的水平翻转就是将矩阵每一行元素逆序。
🍜3.矩阵的垂直翻转
矩阵的垂直翻转就是将矩阵每一列元素逆序。
🍡4.矩阵的顺时针旋转
矩阵的顺时针旋转 90度,顾名思义就是绕着垂直于屏幕方向进行90旋转。
🍛5.矩阵的逆时针旋转
逆时针转90度就是顺时针转270。
🍣6.矩阵的逆时针转置
就是对矩阵的对角线进行交换操作。
📓课后习题
1672. 最富有客户的资产总量
1672. 最富有客户的资产总量
给你一个m x n的整数网格accounts ,其中accounts[i][j]是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。
客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。
解题思路
每行做统计就好了呗?
int maximumWealth(int** accounts, int accountsSize, int* accountsColSize){ int maxn = 0,temp; for(int i = 0;i < accountsSize; ++i){ temp = 0; for(int j = 0;j < *accountsColSize; ++j) temp += accounts[i][j]; if(temp > maxn) maxn = temp; } return maxn; }
1582. 二进制矩阵中的特殊位置
1582. 二进制矩阵中的特殊位置
给你一个大小为rows x cols 的矩阵mat,其中mat[i][j]是 0或 1,请返回 矩阵 mat 中特殊位置的数目 。
特殊位置 定义:如果mat[i][j] == 1 并且第i行和第j列中的所有其他元素均为 0(行和列的下标均 从 0 开始 ),则位置(i, j)被称为特殊位置。
解题思路
先统计列和,可以加速。
int numSpecial(int** mat, int matSize, int* matColSize){ int ans = 0; int hash[*matColSize]; for(int j = 0; j < *matColSize; ++j){ hash[j] = 0; for(int i = 0;i <matSize;i++) if(mat[i][j] == 1) hash[j] ++; } for(int i = 0;i < matSize; ++i){ int temp = 0,tempi = -1; for(int j = 0; j < *matColSize; ++j) if(mat[i][j] == 1) temp++,tempi = j; if(temp == 1) if(hash[tempi] == 1) ans++; } return ans; }
832. 翻转图像
832. 翻转图像
给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。
水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转[1, 1, 0] 的结果是[0, 1, 1]。
反转图片的意思是图片中的0全部被1替换, 1 全部被 0替换。例如,反转 [0, 1, 1] 的结果是[1, 0, 0]。
解题思路
按照要求先翻转在反转就好了。
int** flipAndInvertImage(int** image, int imageSize, int* imageColSize, int* returnSize, int** returnColumnSizes){ *returnSize = imageSize; *returnColumnSizes = imageColSize; int n = imageSize,m = *imageColSize; //printf("%d %d",imageSize,*imageColSize); for (int i = 0; i < n; i++) for(int j = 0; j < (m + 1) / 2; ++j){ if(j == m/2) image[i][j] = !image[i][j]; else{ image[i][j] = image[i][j] ^ image[i][m - 1 - j]; image[i][m - 1 - j] = image[i][j] ^ image[i][m - 1 - j]; image[i][j] = image[i][j] ^ image[i][m - 1 - j]; image[i][j] = !image[i][j]; image[i][m - 1 - j] = !image[i][m - 1 - j]; } } return image; }
48. 旋转图像
48. 旋转图像
给定一个 n × n的二维矩阵 matrix表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
解题思路
所谓旋转就是先转置再水平翻转就好了。
void rotate(int** matrix, int matrixSize, int* matrixColSize){ //转置 for(int i = 0;i < matrixSize; ++i) for(int j = i + 1;j < *matrixColSize; ++j){ matrix[i][j] = matrix[i][j] ^ matrix[j][i]; matrix[j][i] = matrix[i][j] ^ matrix[j][i]; matrix[i][j] = matrix[i][j] ^ matrix[j][i]; } //水平翻转 for(int i = 0;i < matrixSize; ++i) for(int j = 0;j < *matrixColSize /2; ++j){ matrix[i][j] = matrix[i][j] ^ matrix[i][*matrixColSize - 1 -j]; matrix[i][*matrixColSize - 1 -j] = matrix[i][j] ^ matrix[i][*matrixColSize - 1 -j]; matrix[i][j] = matrix[i][j] ^ matrix[i][*matrixColSize - 1 -j]; } return matrix; }