C++程序 检查对角线占优矩阵
在数学中,如果每一行对角线元素的绝对值大于或等于该行所有其他(非对角线)元素的绝对值之和,则称正方形矩阵为 对角线占优矩阵 。 更确切地说,如果矩阵 A 满足以下条件,则其为对角线占优:
例如,矩阵
是对角线占优的,因为
|a 11 | ≥ |a 12 | + |a 13 |,因为| + 3 |≥ |-2| + |+1|
|a 22 | ≥ |a 21 | + |a 23 |,因为|-3| ≥ |+1| + |+2|
|a 33 | ≥ |a 31 | + |a 32 |,因为| + 4 |≥ |-1| + |+2|
给定一个 n 行 n 列的矩阵 A 。任务是检查矩阵 A 是否是对角线占优的。
示例:
输入: A = { { 3, -2, 1 },
{ 1, -3, 2 },
{ -1, 2, 4 } };
输出 : YES
因为每个对角线元素的绝对值都大于其相应行中所有非对角线元素的绝对值之和。
输入 : A = { { -2, 2, 1 },
{ 1, 3, 2 },
{ 1, -2, 0 } };
输出 : NO
思路是从i = 0到n-1运行循环以获取行数,对于每一行,运行j = 0到n-1的循环查找非对角线元素的和,即i!=j。并检查对角线元素是否大于或等于该和。 如果对于任何一行,为false,则返回false或打印“否”。“否则打印“是”。
下面是该方法的实现。
//检查给定矩阵是否为对角线优势矩阵的CPP程序。
#include <bits/stdc++.h>
#define N 3
using namespace std;
//检查给定矩阵是否为对角线优势矩阵。
bool isDDM(int m[N][N], int n)
{
//对于每行
for (int i = 0; i < n; i++)
{
//对于每列,找到每行的和。
int sum = 0;
for (int j = 0; j < n; j++)
sum += abs(m[i][j]);
//移除对角线元素。
sum -= abs(m[i][i]);
//检查对角线元素是否小于非对角线元素的和。
if(abs(m[i][i]) < sum)
return false;
}
return true;
}
//driven程序
int main()
{
int n = 3;
int m[N][N] = {{3, -2, 1},
{1, -3, 2},
{-1,2,4}};
(isDDM(m, n))?(cout << "YES"):(cout << "NO");
return 0;
}
输出
YES
时间复杂度: O(N 2 ) ,使用了嵌套循环
辅助空间: O(1)