【一次过】Lintcode 1042. 托普利兹矩阵

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majichen95/article/details/82747896

“托普利兹矩阵”是指如果从左上角到右下角的同一条主斜线上每个元素都相等的矩阵.

给定一个M x N矩阵,判断是否为“托普利兹矩阵”.

样例

样例 1:

输入: matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]]
输出: True
解释:
1234
5123
9512

在上述矩阵中,主斜线上元素分别为 "[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]", 每一条主斜线上元素都相等,所以返回`True`.


样例 2:

输入: matrix = [[1,2],[2,2]]
输出: False
解释:
主斜线 "[1, 2]" 有不同的元素.

注意事项

  1. matrix 是一个二维整数数组.
  2. matrix 的行列范围都为 [1, 20].

matrix[i][j] 的整数取值范围为[0, 99].


解题思路1:

题目的意思是matrix[i][j]==matrix[++i][++j],所以遍历元素,判断每个元素的主斜线元素是否一致即可。但是缺点是遍历每个元素的话,会重复判断很多次。

public class Solution {
    /**
     * @param matrix: the given matrix
     * @return: True if and only if the matrix is Toeplitz
     */
    public boolean isToeplitzMatrix(int[][] matrix) {
        // Write your code here
        if(matrix.length<2 || matrix[0].length<2)
            return true;
        
        int row = matrix.length;
        int col = matrix[0].length;
        
        for(int i=0 ; i<row ; i++){
            for(int j=0 ; j<col ; j++){
                int ii = i+1;
                int jj = j+1;
                while(ii<row && jj<col){
                    if(matrix[i][j] != matrix[ii++][jj++])
                        return false;
                }
            }
        }
        
        return true;
    }
}

解题思路2:

为了避免重复判断的情况,不用遍历每个元素,只需要从矩阵外轮廓的左下角扫描至右上角即可。

public class Solution {
    /**
     * @param matrix: the given matrix
     * @return: True if and only if the matrix is Toeplitz
     */
    public boolean isToeplitzMatrix(int[][] matrix) {
        // Write your code here
        if(matrix.length<2 || matrix[0].length<2)
            return true;
        
        int row = matrix.length;
        int col = matrix[0].length;
        
        int i = row - 1;
        int j = 0;
        
        while(i<row && j<col){
            int ii = i+1;
            int jj = j+1;
            while(ii<row && jj<col){
                if(matrix[i][j] != matrix[ii++][jj++])
                    return false;
            }
            
            //绕外层轮廓循环
            if(i == 0)
                j++;
            else
                i--;
        }
        
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/majichen95/article/details/82747896