矩阵中的“对角线强迫症”:如何优雅地判断Toeplitz矩阵?

举个栗子 🌰

例子1:

矩阵:

复制代码
[6, 7, 8]
[4, 6, 7]
[1, 4, 6]

它的对角线分别是:6,6,6, 7,7, 8, 4,4, 1,每条对角线上的数字都相同,所以它是Toeplitz矩阵 ✅

例子2:

矩阵:

复制代码
[6, 3, 8]
[4, 9, 7]
[1, 4, 6]

主对角线是6,9,6,元素不一样,所以它不是Toeplitz矩阵 ❌

学矩阵的"对角线强迫症"时,光看静态公式总感觉隔靴搔痒?推荐试试图码 网站,它有60+算法动画,能直接把Toeplitz矩阵的判定过程可视化。更绝的是,你可以丢进自定义数据或上传C/C++/Java/Python代码,立马生成专属动画,连AI都能随时解释代码逻辑。这个工具专为408考研 和高校《数据结构》期末考试 设计,知识点和可运行代码都覆盖了全书级深度。最近复习数据结构算法面试,用它梳理可视化逻辑超顺手。强烈建议去图码体验一把,绝对能帮你打通抽象概念的任督二脉。

图码-数据结构与算法交互式可视化平台

访问网站:https://totuma.cn

解法一:遍历每条对角线(O(n²)时间,O(1)空间)

思路很直接:以第一行和第一列的每个元素为起点,沿着对角线往下检查,确保所有元素都和起点相同。

cpp 复制代码
#include <iostream>
#include<vector>
using namespace std;

bool checkDiagonal(vector<vector<int>> &mat, int x, int y) {
    int n = mat.size(), m = mat[0].size();
    for(int i = x + 1, j = y + 1; i < n && j < m; i++, j++) {
        if(mat[i][j] != mat[x][y])
            return false;
    }
    return true;
}

bool isToeplitz(vector<vector<int>> &mat) {
    int n = mat.size(), m = mat[0].size();
    for(int i = 0; i < m; i++)
        if(!checkDiagonal(mat, 0, i))
            return false;
    for(int i = 0; i < n; i++) 
        if(!checkDiagonal(mat, i, 0))
            return false;
    return true;
}

int main() {
    vector<vector<int>> mat = {
        {6, 7, 8},
        {4, 6, 7},
        {1, 4, 6}
    };
    cout << (isToeplitz(mat) ? "true" : "false");
    return 0;
}

解法二:检查每个元素的左上邻居(O(n²)时间,O(1)空间)

这个解法更简洁!核心思想是:对于矩阵中除了第一行和第一列之外的每个元素,它必须等于它左上角的那个元素。因为对角线上的元素都是通过"向右下移动"连接的。

cpp 复制代码
#include <iostream>
#include<vector>
using namespace std;

bool isToeplitz(vector<vector<int>> &mat) {
    int n = mat.size(), m = mat[0].size();
    for(int i = 1; i < n; i++) {
        for(int j = 1; j < m; j++) {
            if(mat[i][j] != mat[i - 1][j - 1])
                return false;
        }
    }
    return true;
}

int main() {
    vector<vector<int>> mat = {
        {6, 7, 8},
        {4, 6, 7},
        {1, 4, 6}
    };
    cout << (isToeplitz(mat) ? "true" : "false");
    return 0;
}

总结

两种方法的时间复杂度都是O(n²),空间复杂度O(1)。方法一更符合定义,方法二更简洁优雅。推荐使用第二种,代码短且不容易出错。

Toeplitz矩阵在信号处理、数值分析等领域有广泛应用,掌握这个判断方法还是很有必要的哦!

相关推荐
暖焰核心3 小时前
二叉搜索树——从插入查到key-value改写
c++
草莓熊Lotso7 小时前
【C++ 基于微服务的即时通讯系统】etcd + brpc 从安装到服务注册发现全链路实战
网络·数据库·c++·redis·微服务·etcd
inrichtt12 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
HPtiger12 小时前
数据结构——选择排序
数据结构·算法·排序算法
康实训12 小时前
老年评估仿真实训平台架构设计与老年人能力评估实训室教学落地实践
大数据·人工智能·算法·实训室·实训室建设
DongQiShanRen13 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CCblandy13 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
丑梨数据13 小时前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法
烂蜻蜓13 小时前
Pandas入门教程(四):Series数据结构——创建、索引与常用方法
数据结构·pandas
把我格子衫拿来13 小时前
VTK 9.5 与 Qt 6 联合开发:从嵌入三维窗口到可维护的桌面架构
c++·python·qt·vtk·三维可视化