zoukankan      html  css  js  c++  java
  • LeetCode 766. Toeplitz Matrix

    题目:

    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:
    1234
    5123
    9512
    
    In the above grid, the diagonals are "[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]", and 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:

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

    分析:

    矩阵,可以归结到多维数组来进行分析。

    考察多维数组操作。  但是不明白为什么限定元素边界为0-99.

    在循环体中,需要注意return continue和break的区别:

    return直接从函数中返回;

    continue终止当前循环,从下一次循环开始执行;

    break从循环中跳出。

    第一次提交:

    class Solution {
        public boolean isToeplitzMatrix(int[][] matrix) {
            int m,n;
            m = matrix.length;
            n = matrix[0].length;
            
            //int i =0;
           for(int j=0; j<n; j++) {
               int k=0,l=j;
               while(k+1<m&& l+1<n) {
                   if(matrix[k][l] == matrix[k+1][l+1]) {
                       continue;
                   } else {
                       return false;
                   }
               }
                   
           }// upper
            
           
           //int j =0;
           for(int i=0; i<m; i++) {
               int k=i,l=0;
               while(k+1<m && l+1<n) {
                   if(matrix[k][l] == matrix[k+1][l+1]) {
                       continue;
                   } else {
                       return false;
                   }
               }
                   
           }// upper
            
            
            return true;
            
            /*matrix00 m11 m22
            m01 m12 m23
            
            
            m13
            m23,
            
            */
        }
    }

    结果:

    Run Code Status: Time Limit Exceeded
    Run Code Result:
    Your input
    
    [[1,2,3,4],[5,1,2,3],[9,5,1,2]]
    
    Your answer
    
    
    Expected answer
    
    true
    
    Runtime: N/A

    分析:

    看来n的平方阶的算法不可行。

    但m*n的时间复杂度看来是必须的,因为至少要遍历一遍矩阵,才能确定。

    一个未完成的中间版本,原本打算使用一维数组代替二维数组,但后来发现没有本质区别。

    class Solution {
        public boolean isToeplitzMatrix(int[][] matrix) {
            int m = matrix.length;
            int n = matrix[0].length;
            
            int[] array = new int[m*n];
            /*for(int i=0; i<400; i++) {
                array[i] = -1;
            }*/
            
            for(int i=0; i<m; i++) {
                for(int j = 0; j<n; j++) {
                    array[i*n+j] = matrix[i][j];
                }
            }
            
            //int
            /*for(int i=0; i<400;i++) {
                if(array[i] != -1) {
                    continue;
                } else {
                    
                }
            }*/
            
            
            
            /* 1 3 5, 4 1 3, 2 4 1,
            */
            
            
        }
    }

    查看了hint, 找到了解题关键: 每一个元素的特征:与左上角的元素相同。

    class Solution {
        public boolean isToeplitzMatrix(int[][] matrix) {
    
            int m= matrix.length;
            int n= matrix[0].length;
            
            for(int i=0; i<m; i++){
                for(int j=0; j<n; j++) {
                    if((0<i-1 && i-1<m)&&(0<j-1 && j-1<n)) {
                        if(matrix[i-1][j-1] != matrix[i][j]) {
                            return false;
                        }
                    }
                }
            }
            
            return true;
        }
    }

     结果:

    Submission Result: Wrong Answer 
     
    Input: [[1,2],[2,2]]
    Output: true
    
    Expected: false

    修改后再次提交:

    class Solution {
        public boolean isToeplitzMatrix(int[][] matrix) {
    
            int m= matrix.length;
            int n= matrix[0].length;
            
            for(int i=0; i<m; i++){
                for(int j=0; j<n; j++) {
                    if(((0<=i-1) && (i-1<m))&&((0<=j-1) && (j-1<n))) {
                        if(matrix[i-1][j-1] != matrix[i][j]) {
                            return false;
                        }
                    }
                }
            }
            
            return true;
        }
    }

     

     结果:

    Submission Result: Accepted

    分析:

    这道题找到正确思路前看了一下提示。之前没有找到正确的思路。

  • 相关阅读:
    GDOI 2019 退役记
    SHOI2019 游记
    【WC2014】紫荆花之恋
    PKUWC 2019 & NOIWC2019 比赛总结 Formal Version
    WC 2019 颓废记
    VDUVyRLYJC
    Git学习
    DOM学习笔记
    python基础---->AJAX的学习
    python基础---->进程、线程及相关等
  • 原文地址:https://www.cnblogs.com/hzg1981/p/8817862.html
Copyright © 2011-2022 走看看