1. 程式人生 > >【一次過】Lintcode 1042. 託普利茲矩陣

【一次過】Lintcode 1042. 託普利茲矩陣

“託普利茲矩陣”是指如果從左上角到右下角的同一條主斜線上每個元素都相等的矩陣.

給定一個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;
    }
}