一. 介绍
首先我们要清楚矩阵是什么:矩阵是一个按照长方阵列排列的复数或实数集合
1> 定义
- 定义:m×n矩阵为m×n个数排成的m行n列的表格,当m=n时,矩阵A称为n阶方阵或者n阶矩阵。
- 零矩阵:矩阵所有元素都为0。
- 同型矩阵:A矩阵为m×n矩阵,B矩阵为s×t矩阵,如果m=s,n=t,A和B即为同型矩阵。
- A和B相等:两个同型矩阵对应的元素都相等
- |A|(detA):n阶方阵A构成的行列式。
以上就为3*4的一个矩阵
2> 运算
- 加法:两个同型矩阵可以相加
- 数乘:k为数,数乘时是将k与矩阵中每一个元素进行乘积
- 乘法:设A是一个m×s矩阵,B是一个s×t矩阵(A的列数=B的行数),则A、B可乘,且乘积AB是一个m×t矩阵,记为C。其中C的第i行、第j列元素Cij是A的第i行s个元素和B的第j列s个对应元素两两乘积之和。(每个新元素等于原来两个矩阵对应行元素逐个乘上对应列元素,再加和)
- 转置:将m×n型矩阵A=[aij]m×n的行列互换的到的n×m矩阵[aji]n×m,称为A的转置矩阵。
- 矩阵多项式:设A是n阶矩阵,f(x)=amxm+……+a1x+a0是x的多项式,则称 amAm+am-1Am-1+……+a1A+a0E为矩阵多项式,记为f(A)
3> 性质:
Ⅰ.加法
- A+B=B+A
- (A+B)+C=A+(B+C)
- A+O=A (其中O是元素全为0的同型矩阵)
- A+(-A)=O
Ⅱ.数乘
- k(mA)=(km)A=m(kA)
- (k+m)A=kA+mA
- k(A+B)=kA+kB
- 1A=A
- 0A=O
Ⅲ.乘法
- (AB)C=A(BC)
- A(B+C)=AB+AC
- (B+C)A=BA+CA(注意顺序不可以颠倒)
Ⅳ.转置
- (A+B)T=AT+BT
- (kA)T=kAT
- (AB)T=BTAT
- (AT)T=A
注意
- AB≠BA
- A≠O,B≠O,但有可能AB=O
- AB=AC,A≠O不能推出B=C
- (A+B)(A+B)=A2+AB+BA+B2
- (A+E)2=A2+2A+E
- (A+E)(A-E)=A2-E2
- AB=O 可推出B的列向量是AX=0的解
二. 算法
矩阵类题目常常把思考的维度从一维扩展到二维,需要考虑的边界条件也相应增多,以矩阵为背景的题目大多有动态规划类型、记忆搜索类型、深度优先搜索类型等等。
实例一:
题目描述:有x*y大小的格子,只能从左往右、从上往下走,问从左上到右下有多少种走法
示例:
一个2*3的矩阵,
1 2 3
4 5 6
从1出发走到6,则可能的走法为:1 2 3 6, 1 2 5 6, 1 4 5 6共有三种。
解决思路:从最后一个格子进行倒推,需要找到关系方程:res[i][j] = res[i-1][j] + res[i][j-1],然后可以用递归或者非递归的方法进行求解。
递归:
public static int numPath(int x, int y) {
if(x==1||y==1) return 1;
return numPath2(x-1, y) + numPath2(x, y-1);
}
非递归:
public static int numPath(int x, int y) {
if(x == 1 || y == 1){
return 1;
}
int[][] res = new int[x][y];
for(int i = 0; i < x; i++){
res[i][0] = 1;
}
for(int i = 0; i < y; i++){
res[0][i] = 1;
}
for(int i = 1; i < x; i++) {
for(int j = 1; j < y; j++) {
res[i][j] = res[i-1][j] + res[i][j-1];
}
}
return res[x-1][y-1];
}
示例二:
给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
使用两个标记变量
思路和算法
在代码中,我们用两个标记数组分别记录每一行和每一列是否有零出现,我们首先预处理出两个标记变量,接着使用其他行与列去处理第一行与第一列,然后反过来使用第一行与第一列去更新其他行与列,最后使用两个标记变量更新第一行与第一列即可。
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
boolean flagCol0 = false, flagRow0 = false;
for (int i = 0; i < m; i++) {
if (matrix[i][0] == 0) {
flagCol0 = true;
}
}
for (int j = 0; j < n; j++) {
if (matrix[0][j] == 0) {
flagRow0 = true;
}
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (matrix[i][j] == 0) {
matrix[i][0] = matrix[0][j] = 0;
}
}
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
if (flagCol0) {
for (int i = 0; i < m; i++) {
matrix[i][0] = 0;
}
}
if (flagRow0) {
for (int j = 0; j < n; j++) {
matrix[0][j] = 0;
}
}
}
}
题出处:73. 矩阵置零 - 力扣(LeetCode)
❤️❤️❤️