C++程序 检查矩阵是否对称
如果矩阵的转置与给定矩阵相同,则称该方阵为 对称矩阵 ,可以通过将行变为列,将列变为行来获得 对称矩阵 。
例如:
输入:1 2 3
2 1 4
3 4 3
输出:Yes
输入:3 5 8
3 4 7
8 5 3
输出:No
下面是一个简单的解法:
- 创建给定矩阵的转置矩阵。
- 检查转置矩阵和给定矩阵是否相同。
//检查一个矩阵是否对称的C++代码。
#include <iostream>
using namespace std;
const int MAX = 100;
//在tr[N][N]中填充mat[N][N]的转置
void transpose(int mat[][MAX], int tr[][MAX], int N)
{
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
tr[i][j] = mat[j][i];
}
//如果mat[N][N]是对称的,则返回true,否则返回false
bool isSymmetric(int mat[][MAX], int N)
{
int tr[N][MAX];
transpose(mat, tr, N);
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
if (mat[i][j] != tr[i][j])
return false;
return true;
}
//驱动程序
int main()
{
int mat[][MAX] = { { 1, 3, 5 },
{ 3, 2, 4 },
{ 5, 4, 1 } };
if (isSymmetric(mat, 3))
cout << "Yes";
else
cout << "No";
return 0;
}
输出 :
Yes
时间复杂度:O(N × N)
辅助空间:O(N × N)
下面是一种更高效的解法来检查一个矩阵是否对称,而不创建转置矩阵。我们基本上需要比较mat[i][j] 和 mat[j][i]。
//检查一个矩阵是否对称的高效C++代码。
#include <iostream>
using namespace std;
const int MAX = 100;
//如果mat[N][N]是对称的,则返回true,否则返回false
bool isSymmetric(int mat[][MAX], int N)
{
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
if (mat[i][j] != mat[j][i])
return false;
return true;
}
//驱动程序
int main()
{
int mat[][MAX] = { { 1, 3, 5 },
{ 3, 2, 4 },
{ 5, 4, 1 } };
if (isSymmetric(mat, 3))
cout << "Yes";
else
cout << "No";
return 0;
}
输出:
Yes
时间复杂度:O(N×N)
辅助空间:O(1)