LeetCode0766.托普利茨矩阵

766托普利茨矩阵-数组

描述

如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵

给定一个 M x N 的矩阵,当且仅当它是托普利茨矩阵时返回 True

实例

输入: 
matrix = [
  [1,2,3,4],
  [5,1,2,3],
  [9,5,1,2]
]
输出: True
解释:
在上述矩阵中, 其对角线为:
"[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]"。
各条对角线上的所有元素均相同, 因此答案是True。
输入:
matrix = [
  [1,2],
  [2,2]
]
输出: False
解释: 
对角线"[1, 2]"上的元素不同。

题解

一开始看成需要对角线为对称的,直接被带偏到沟里去了,然后发现只要判断每一条对角线上的元素是否相等,那就更加简单了.首先发现,对角线的起点可以从横边开始,也可以从竖边开始,那就两次for循环判断所有的对角线是否都相等.

static public boolean isToeplitzMatrix(int[][] matrix) {
    int W = matrix[0].length;
    int H = matrix.length;

    for (int i = 0; i < H; i++) {
        ArrayList<Integer> nowList = new ArrayList<>();
        int nowH = i;
        int nowW = 0;
        int nowValue = matrix[nowH][nowW];
        while (true){
            if ((nowH < H) & ((nowW < W))){
                if (matrix[nowH][nowW] == nowValue){
                    nowH++;
                    nowW++;
                } else
                    return false;

            } else
                break;
        }
    }
    for (int i = 0; i < W; i++) {
        ArrayList<Integer> nowList = new ArrayList<>();
        int nowH = 0;
        int nowW = i;
        int nowVlaue = matrix[nowH][nowW];
        while (true){
            if ((nowH < H) & ((nowW < W))){
                if (matrix[nowH][nowW] == nowVlaue){
                    nowH++;
                    nowW++;
                } else
                    return false;

            } else
                break;
        }
    }
    return true;
}

进阶

  1. 如果矩阵存储在磁盘上,并且磁盘内存是有限的,因此一次最多只能将一行矩阵加载到内存中,该怎么办?
  2. 如果矩阵太大以至于只能一次将部分行加载到内存中,该怎么办?

如果再仔细观察矩阵,发现判断时不一定要按照对角线来,只要有任意一个元素与右下角的元素不相同则该矩阵就不是题目要求的矩阵

static public boolean isToeplitzMatrix(int[][] matrix) {
    int W = matrix[0].length;
    int H = matrix.length;

    for (int i = 0; i < H-1; i++) {
        for (int j = 0; j < W - 1; j++) {
            if (matrix[i][j] != matrix[i+1][j+1])
                return false;
        }
    }
    return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值