LeetCode C++ 766. Toeplitz Matrix【Array】简单

A matrix is Toeplitz if every diagonal from top-left to bottom-right has the same element.

Now given an M x N matrix, return True if and only if the matrix is Toeplitz .

Example 1:

Input:
matrix = [
  [1,2,3,4],
  [5,1,2,3],
  [9,5,1,2]
]
Output: True
Explanation:
In the above grid, the diagonals are:
"[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]".
In each diagonal all elements are the same, so the answer is True.

Example 2:

Input:
matrix = [
  [1,2],
  [2,2]
]
Output: False
Explanation:
The diagonal "[1, 2]" has different elements.

Note:

  • matrix will be a 2D array of integers.
  • matrix will have a number of rows and columns in range [1, 20] .
  • matrix[i][j] will be integers in range [0, 99] .

Follow up:

  • What if the matrix is stored on disk, and the memory is limited such that you can only load at most one row of the matrix into the memory at once?
  • What if the matrix is so large that you can only load up a partial row into the memory at once?

题意:如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。给定一个 M x N 的矩阵,当且仅当它是托普利茨矩阵时返回 True


思路1

如果我们从第一行开始,对右上的每条对角线进行检查,然后从第一列开始,对左下的每条对角线进行检查,就可以完成这一任务。代码如下:

class Solution {
public:
    bool isToeplitzMatrix(vector<vector<int>>& matrix) {
        int row = matrix.size(), col = matrix[0].size();
        for (int i = 0; i < col; ++i) {
            int diagonal = matrix[0][i], k = i;
            for (int j = 1; j < row; ++j) {
                if (k + 1 >= col) break;
                if (diagonal != matrix[j][++k]) return false;
            }
        }
        for (int i = 1; i < row; ++i) {
            int diagonal = matrix[i][0], k = 0;
            for (int j = i + 1; j < row; ++j) {
                if (k + 1 >= col) break;
                if (diagonal != matrix[j][++k]) return false;
            } 
        }
        return true;
    }
};

提交后结果如下:

执行用时:20 ms, 在所有 C++ 提交中击败了83.68% 的用户
内存消耗:15.9 MB, 在所有 C++ 提交中击败了92.76% 的用户

思路2

更简单的做法是,我们仔细观察矩阵,如果它是托普利茨矩阵,那么每个元素都和其紧邻的左上位置的元素相等。代码如下:

class Solution {
public:
    bool isToeplitzMatrix(vector<vector<int>>& matrix) {
        int row = matrix.size(), col = matrix[0].size();
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < col; ++j) {
                if (i == 0 || j == 0) continue;
                if (matrix[i][j] != matrix[i - 1][j - 1]) return false;
            }
        }
        return true;
    }
};

效率如下:

执行用时:20 ms, 在所有 C++ 提交中击败了83.68% 的用户
内存消耗:16 MB, 在所有 C++ 提交中击败了52.04% 的用户

进阶问题:

  • 如果矩阵存储在磁盘上,并且磁盘内存是有限的,因此一次最多只能将一行矩阵加载到内存中,该怎么办?
    回答:内存地址实际上是一维的,我们比较的是 arr[i][j]arr[i - 1][j - 1] ,只要知道矩阵的列数,就可以计算出 arr[i - 1][j - 1] 的位置。
  • 如果矩阵太大以至于只能一次将部分行加载到内存中,该怎么办?
内容概要:本文档《opencv高频面试题.docx》涵盖了OpenCV的基础概念、图像处理操作、特征提取与匹配、目标检测与机器学习、实际编程题、性能优化以及进阶问题。首先介绍了OpenCV作为开源计算机视觉库,支持图像/视频处理、目标检测、机器学习等领域,应用于安防、自动驾驶、医学影像、AR/VR等方面。接着详细讲述了图像的存储格式(如Mat类)、通道的概念及其转换方法。在图像处理部分,讲解了图像灰度化、二值化、边缘检测等技术。特征提取方面,对比了Harris和Shi-Tomasi角点检测算法,以及SIFT、SURF、ORB的特征提取原理和优缺点。目标检测部分介绍了Haar级联检测原理,并阐述了如何调用深度学习模型进行目标检测。文档还提供了几个实际编程题示例,如读取并显示图像、图像旋转、绘制矩形框并保存等。最后,探讨了性能优化的方法,如使用cv2.UMat(GPU加速)、减少循环等,以及相机标定、光流等进阶问题。 适合人群:对计算机视觉有一定兴趣,具备一定编程基础的学习者或从业者。 使用场景及目标:①帮助学习者掌握OpenCV的基本概念和技术;②为面试准备提供参考;③为实际项目开发提供技术指导。 阅读建议:由于内容涵盖广泛,建议读者根据自身需求有选择地深入学习相关章节,并结合实际编程练习加深理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

memcpy0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值