Gegeben sei eine quadratische Matrix zusammen mit[][] der Ordnung N Ihre Aufgabe besteht darin, zu prüfen, ob es sich um eine Toeplitz-Matrix handelt.
Notiz: Eine Toeplitz-Matrix – auch diagonalkonstante Matrix genannt – ist eine Matrix, in der die Elemente jeder einzelnen absteigenden Diagonale von links nach rechts gleich sind. Äquivalent für jeden Eintrag mat[i][j] ist es dasselbe wie mat[i-1][j-1] oder mat[i-2][j-2] und so weiter.
Beispiele:
Eingang: mit[][] = [ [6 7 8]
[4 6 7]
[1 4 6] ]
Ausgabe: Ja
Erläuterung: Alle Diagonalen der gegebenen Matrix sind [6 6 6] [7 7] [8] [4 4] [1]. Da für jede Diagonale alle Elemente gleich sind, ist die gegebene Matrix die Toeplitz-Matrix.Eingang: mit[][] = [ [6 3 8]
[4 9 7]
[1 4 6] ]
Ausgabe: NEIN
Erläuterung: Die primären Diagonalelemente der gegebenen Matrix sind [6 9 6]. Da die Diagonalelemente nicht gleich sind, ist die angegebene Matrix keine Toeplitz-Matrix.
[Erwarteter Ansatz – 1] – Überprüfung jeder Diagonale – O(n * n) Zeit und O(1) Raum
Die Idee besteht darin, jede nach unten geneigte Diagonale in der Matrix zu durchlaufen, indem man jedes Element in der ersten Zeile und jedes Element in der ersten Spalte als Ausgangspunkt verwendet und überprüft, ob jedes Element entlang dieser Diagonale mit dem Wert an der Spitze übereinstimmt.
Befolgen Sie die unten angegebenen Schritte:
- Lassen
n = mat.size()Undm = mat[0].size(). - Für jeden Spaltenindex
iaus0Zum - 1AnrufcheckDiagonal(mat 0 i); Wenn es „false“ zurückgibt, wird sofort „false“ zurückgegebenisToeplitz. - Für jeden Zeilenindex
iaus0Zun - 1AnrufcheckDiagonal(mat i 0); Wenn es „false“ zurückgibt, wird sofort „false“ zurückgegebenisToeplitz. - Wenn alle Anrufe zu
checkDiagonalerfolgreich sein, true zurückgeben. - In
checkDiagonal(mat x y)vergleichenmat[i][j]Zumat[x][y]für jedeni = x+1 j = y+1währendi < n && j < m; Geben Sie bei der ersten Nichtübereinstimmung „false“ zurück, andernfalls geben Sie „true“ zurück, nachdem Sie die Kante erreicht haben.
Unten ist angegeben Durchführung:
C++
#include using namespace std; // function to check if diagonal elements are same bool checkDiagonal(vector<vector<int>> &mat int x int y) { int n = mat.size() m = mat[0].size(); for(int i = x + 1 j = y + 1; i < n && j < m; i++ j++) { if(mat[i][j] != mat[x][y]) return false; } return true; } // Function to check whether given // matrix is toeplitz matrix or not bool isToeplitz(vector<vector<int>> &mat) { int n = mat.size() m = mat[0].size(); // check each descending diagonal starting from // first row and first column of the matrix for(int i = 0; i < m; i++) if(!checkDiagonal(mat 0 i)) return false; for(int i = 0; i < n; i++) if(!checkDiagonal(mat i 0)) return false; // if all diagonals are same return true return true; } int main() { vector<vector<int>> mat = { {6 7 8} {4 6 7} {1 4 6} }; if(isToeplitz(mat)) { cout << 'Yes'; } else { cout << 'No'; } return 0; }
Java import java.util.*; class GfG { // function to check if diagonal elements are same static boolean checkDiagonal(List<List<Integer>> mat int x int y) { int n = mat.size() m = mat.get(0).size(); for(int i = x + 1 j = y + 1; i < n && j < m; i++ j++) { if(!mat.get(i).get(j).equals(mat.get(x).get(y))) return false; } return true; } // Function to check whether given // matrix is toeplitz matrix or not static boolean isToeplitz(List<List<Integer>> mat) { int n = mat.size() m = mat.get(0).size(); // check each descending diagonal starting from // first row and first column of the matrix for(int i = 0; i < m; i++) if(!checkDiagonal(mat 0 i)) return false; for(int i = 0; i < n; i++) if(!checkDiagonal(mat i 0)) return false; // if all diagonals are same return true return true; } public static void main(String[] args) { List<List<Integer>> mat = Arrays.asList( Arrays.asList(6 7 8) Arrays.asList(4 6 7) Arrays.asList(1 4 6) ); if(isToeplitz(mat)) { System.out.println('Yes'); } else { System.out.println('No'); } } }
Python # function to check if diagonal elements are same def checkDiagonal(mat x y): n m = len(mat) len(mat[0]) i j = x + 1 y + 1 while i < n and j < m: if mat[i][j] != mat[x][y]: return False i += 1 j += 1 return True # Function to check whether given # matrix is toeplitz matrix or not def isToeplitz(mat): n m = len(mat) len(mat[0]) # check each descending diagonal starting from # first row and first column of the matrix for i in range(m): if not checkDiagonal(mat 0 i): return False for i in range(n): if not checkDiagonal(mat i 0): return False # if all diagonals are same return true return True mat = [ [6 7 8] [4 6 7] [1 4 6] ] if isToeplitz(mat): print('Yes') else: print('No')
C# using System; using System.Collections.Generic; class GfG { // function to check if diagonal elements are same static bool checkDiagonal(List<List<int>> mat int x int y) { int n = mat.Count m = mat[0].Count; for(int i = x + 1 j = y + 1; i < n && j < m; i++ j++) { if(mat[i][j] != mat[x][y]) return false; } return true; } // Function to check whether given // matrix is toeplitz matrix or not static bool isToeplitz(List<List<int>> mat) { int n = mat.Count m = mat[0].Count; // check each descending diagonal starting from // first row and first column of the matrix for(int i = 0; i < m; i++) if(!checkDiagonal(mat 0 i)) return false; for(int i = 0; i < n; i++) if(!checkDiagonal(mat i 0)) return false; // if all diagonals are same return true return true; } static void Main() { var mat = new List<List<int>> { new List<int> {6 7 8} new List<int> {4 6 7} new List<int> {1 4 6} }; if(isToeplitz(mat)) { Console.WriteLine('Yes'); } else { Console.WriteLine('No'); } } }
JavaScript // function to check if diagonal elements are same function checkDiagonal(mat x y) { let n = mat.length m = mat[0].length; for(let i = x + 1 j = y + 1; i < n && j < m; i++ j++) { if(mat[i][j] !== mat[x][y]) return false; } return true; } // Function to check whether given // matrix is toeplitz matrix or not function isToeplitz(mat) { let n = mat.length m = mat[0].length; // check each descending diagonal starting from // first row and first column of the matrix for(let i = 0; i < m; i++) if(!checkDiagonal(mat 0 i)) return false; for(let i = 0; i < n; i++) if(!checkDiagonal(mat i 0)) return false; // if all diagonals are same return true return true; } let mat = [ [6 7 8] [4 6 7] [1 4 6] ]; if(isToeplitz(mat)) { console.log('Yes'); } else { console.log('No'); }
Ausgabe
Yes
[Erwarteter Ansatz – 2] – Diagonal über dem Element prüfen – O(n * n) Zeit und O(1) Raum
Die Idee besteht darin, jede Zelle ab der zweiten Zeile und zweiten Spalte zu scannen und jeden Wert mit seinem Nachbarn oben links zu vergleichen. Wenn ein Element von dem diagonal darüber abweichenden Element abweicht, haben Sie einen Verstoß gegen die Toeplitz-Eigenschaft festgestellt und können sofort damit aufhören; Wenn Sie die gesamte Matrix ohne Abweichung durchlaufen, ist jede Diagonale konstant.
Befolgen Sie die unten angegebenen Schritte:
- Lassen
n = mat.size()Undm = mat[0].size(). - Iterieren
ivon 1 bisn - 1und darinjvon 1 bism - 1. - Wenn
mat[i][j] != mat[i - 1][j - 1]jederzeit zurückkehrenfalse. - Sobald alle Paare überprüft wurden und keine Abweichungen vorliegen, kehren Sie zurück
true.
Unten ist angegeben Durchführung:
C++#include using namespace std; // Function to check whether given // matrix is toeplitz matrix or not bool isToeplitz(vector<vector<int>> &mat) { int n = mat.size() m = mat[0].size(); // check diagonally above element of // each element in the matrix for(int i = 1; i < n; i++) { for(int j = 1; j < m; j++) { if(mat[i][j] != mat[i - 1][j - 1]) return false; } } // if all diagonals are same return true return true; } int main() { vector<vector<int>> mat = { {6 7 8} {4 6 7} {1 4 6} }; if(isToeplitz(mat)) { cout << 'Yes'; } else { cout << 'No'; } return 0; }
Java import java.util.*; class GfG { // Function to check whether given // matrix is toeplitz matrix or not static boolean isToeplitz(List<List<Integer>> mat) { int n = mat.size() m = mat.get(0).size(); // check diagonally above element of // each element in the matrix for(int i = 1; i < n; i++) { for(int j = 1; j < m; j++) { if(mat.get(i).get(j) != mat.get(i - 1).get(j - 1)) return false; } } // if all diagonals are same return true return true; } public static void main(String[] args) { List<List<Integer>> mat = Arrays.asList( Arrays.asList(6 7 8) Arrays.asList(4 6 7) Arrays.asList(1 4 6) ); if(isToeplitz(mat)) { System.out.println('Yes'); } else { System.out.println('No'); } } }
Python # Function to check whether given # matrix is toeplitz matrix or not def isToeplitz(mat): n m = len(mat) len(mat[0]) # check diagonally above element of # each element in the matrix for i in range(1 n): for j in range(1 m): if mat[i][j] != mat[i - 1][j - 1]: return False # if all diagonals are same return true return True mat = [ [6 7 8] [4 6 7] [1 4 6] ] if isToeplitz(mat): print('Yes') else: print('No')
C# using System; using System.Collections.Generic; class GfG { // Function to check whether given // matrix is toeplitz matrix or not static bool isToeplitz(List<List<int>> mat) { int n = mat.Count m = mat[0].Count; // check diagonally above element of // each element in the matrix for(int i = 1; i < n; i++) { for(int j = 1; j < m; j++) { if(mat[i][j] != mat[i - 1][j - 1]) return false; } } // if all diagonals are same return true return true; } static void Main() { var mat = new List<List<int>> { new List<int> {6 7 8} new List<int> {4 6 7} new List<int> {1 4 6} }; if(isToeplitz(mat)) { Console.WriteLine('Yes'); } else { Console.WriteLine('No'); } } }
JavaScript // Function to check whether given // matrix is toeplitz matrix or not function isToeplitz(mat) { let n = mat.length m = mat[0].length; // check diagonally above element of // each element in the matrix for(let i = 1; i < n; i++) { for(let j = 1; j < m; j++) { if(mat[i][j] !== mat[i - 1][j - 1]) return false; } } // if all diagonals are same return true return true; } let mat = [ [6 7 8] [4 6 7] [1 4 6] ]; if(isToeplitz(mat)) { console.log('Yes'); } else { console.log('No'); }
Ausgabe
Yes
[Alternativer Ansatz] – Verwendung von Hashing – O(n * n) Zeit und O(n) Raum
Die Idee besteht darin, jeder Diagonale unten rechts eine eindeutige Kennung zuzuweisen (Zeilenindex minus Spaltenindex) und eine Hash-Map zu verwenden, um den ersten für diese Diagonale gesehenen Wert aufzuzeichnen. Während Sie die gesamte Matrix scannen, berechnen Sie diesen Schlüssel für jede Zelle und überprüfen entweder, ob er mit dem gespeicherten Wert übereinstimmt, oder speichern ihn, wenn er neu ist. Bei einer einzigen Nichtübereinstimmung können Sie mit false aussteigen; andernfalls kommt man am Ende zu dem Schluss, dass es wahr ist.
Befolgen Sie die unten angegebenen Schritte:
- Bestimmen Sie die Matrixdimensionen (Zeilenanzahl und Spaltenanzahl) aus
mat. - Erstellen Sie eine leere Hashmap
mpum jeden Diagonalschlüssel seinem repräsentativen Wert zuzuordnen. - Gehen Sie durch jede Zelle
matdurch seinen Zeilenindexiund Spaltenindexj. - Bilden Sie für jede Zelle den Diagonalschlüssel durch Subtrahieren
jausi. - Wenn
mpEnthält diesen Schlüssel bereits. Vergleichen Sie das aktuelle Element mit dem gespeicherten Wert. Wenn sie sich unterscheiden, wird sofort false zurückgegeben. - Wenn der Schlüssel noch nicht drin ist
mpZeichnen Sie das aktuelle Element unter diesem Schlüssel auf. - Wenn Sie den Durchlauf ohne Abweichungen abschließen, geben Sie „true“ zurück.
Illustration:
Das folgende Diagramm veranschaulicht diese Idee besser. Betrachten Sie die diagonale Farbe Gelb. Die Differenz zwischen dem X-Wert und dem Y-Wert jedes Indexes auf dieser Diagonale beträgt 2 (2-0 3-1 4-2 5-3). Das Gleiche lässt sich für alle Körperdiagonalen beobachten.
Für rot gefärbte Diagonalen beträgt der Unterschied 3. Für grün gefärbte Diagonalen beträgt der Unterschied 0. Für orange gefärbte Diagonalen beträgt der Unterschied -2 und so weiter ...
Unten ist angegeben Durchführung:
C++#include using namespace std; // Function to check whether given // matrix is toeplitz matrix or not bool isToeplitz(vector<vector<int>> &mat) { int n = mat.size() m = mat[0].size(); // HashMap to store keyvalue pairs unordered_map<int int> mp; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { int key = i - j; // If key value exists in the hashmap if (mp[key]) { // check if the value is same // as the current element if (mp[key] != mat[i][j]) return false; } // Else we put keyvalue pair in hashmap else { mp[i - j] = mat[i][j]; } } } return true; } int main() { vector<vector<int>> mat = { {6 7 8} {4 6 7} {1 4 6} }; if(isToeplitz(mat)) { cout << 'Yes'; } else { cout << 'No'; } return 0; }
Java // JAVA program to check whether given matrix // is a Toeplitz matrix or not import java.util.*; class GFG { static boolean isToeplitz(int[][] matrix) { // row = number of rows // col = number of columns int row = matrix.length; int col = matrix[0].length; // HashMap to store keyvalue pairs HashMap<Integer Integer> map = new HashMap<Integer Integer>(); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { int key = i - j; // if key value exists in the hashmap if (map.containsKey(key)) { // we check whether the current value // stored in this key matches to element // at current index or not. If not // return false if (map.get(key) != matrix[i][j]) return false; } // else we put keyvalue pair in hashmap else { map.put(i - j matrix[i][j]); } } } return true; } // Driver Code public static void main(String[] args) { int[][] matrix = { { 12 23 -32 } { -20 12 23 } { 56 -20 12 } { 38 56 -20 } }; // Function call String result = (isToeplitz(matrix)) ? 'Yes' : 'No'; System.out.println(result); } }
Python # Python3 program to check whether given matrix # is a Toeplitz matrix or not def isToeplitz(matrix): # row = number of rows # col = number of columns row = len(matrix) col = len(matrix[0]) # dictionary to store keyvalue pairs map = {} for i in range(row): for j in range(col): key = i-j # if key value exists in the map if (key in map): # we check whether the current value stored # in this key matches to element at current # index or not. If not return false if (map[key] != matrix[i][j]): return False # else we put keyvalue pair in map else: map[key] = matrix[i][j] return True # Driver Code if __name__ == '__main__': matrix = [[12 23 -32] [-20 12 23] [56 -20 12] [38 56 -20]] # Function call if (isToeplitz(matrix)): print('Yes') else: print('No')
C# using System; using System.Collections.Generic; class GfG { // Function to check whether given // matrix is toeplitz matrix or not static bool isToeplitz(List<List<int>> mat) { int n = mat.Count m = mat[0].Count; // HashMap to store keyvalue pairs Dictionary<intint> mp = new Dictionary<intint>(); for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { int key = i - j; // If key value exists in the hashmap if (mp.ContainsKey(key)) { // check if the value is same // as the current element if (mp[key] != mat[i][j]) return false; } // Else we put keyvalue pair in hashmap else { mp[i - j] = mat[i][j]; } } } return true; } static void Main() { var mat = new List<List<int>> { new List<int> {6 7 8} new List<int> {4 6 7} new List<int> {1 4 6} }; if(isToeplitz(mat)) { Console.WriteLine('Yes'); } else { Console.WriteLine('No'); } } }
JavaScript // Function to check whether given // matrix is toeplitz matrix or not function isToeplitz(mat) { let n = mat.length m = mat[0].length; // HashMap to store keyvalue pairs const mp = new Map(); for(let i = 0; i < n; i++) { for(let j = 0; j < m; j++) { let key = i - j; // If key value exists in the hashmap if (mp.has(key)) { // check if the value is same // as the current element if (mp.get(key) !== mat[i][j]) return false; } // Else we put keyvalue pair in hashmap else { mp.set(i - j mat[i][j]); } } } return true; } let mat = [ [6 7 8] [4 6 7] [1 4 6] ]; if(isToeplitz(mat)) { console.log('Yes'); } else { console.log('No'); }
Ausgabe
Yes
