Je dána čtvercová matice spolu s[][] řádu n vaším úkolem je zkontrolovat, zda se jedná o Toeplitz Matrix.
Poznámka: Toeplitzova matice – také nazývaná diagonálně-konstantní matice – je matice, kde jsou prvky každé jednotlivé sestupné úhlopříčky stejné zleva doprava. Ekvivalentně pro jakýkoli záznam mat[i][j] je stejný jako mat[i-1][j-1] nebo mat[i-2][j-2] a syn dál.
Příklady:
Vstup: s[][] = [ [6 7 8]
[4 6 7]
[1 4 6] ]
výstup: Ano
Vysvětlení: Všechny úhlopříčky dané matice jsou [6 6 6] [7 7] [8] [4 4] [1]. Pro každou úhlopříčku, protože všechny prvky jsou stejné, je daná matice Toeplitzova matice.Vstup: s[][] = [ [6 3 8]
[4 9 7]
[1 4 6] ]
výstup: Žádný
Vysvětlení: Primární diagonální prvky dané matice jsou [6 9 6]. Protože diagonální prvky nejsou stejné, daná matice není Toeplitzova matice.
[Očekávaný přístup - 1] - Kontrola každé úhlopříčky - O(n * n) Čas a O(1) Prostor
Cílem je projít každou dolů skloněnou diagonálu v matici pomocí každého prvku v prvním řádku a každého prvku v prvním sloupci jako výchozího bodu a ověřit, že každý prvek podél této úhlopříčky odpovídá hodnotě na jejím začátku.
Postupujte podle níže uvedených kroků:
- Nechat
n = mat.size()am = mat[0].size(). - Pro každý index sloupce
iz0nam - 1volánícheckDiagonal(mat 0 i); pokud vrátí hodnotu false, okamžitě vraťte hodnotu false fromisToeplitz. - Pro každý index řádku
iz0nan - 1volánícheckDiagonal(mat i 0); pokud vrátí hodnotu false, okamžitě vraťte hodnotu false fromisToeplitz. - Pokud všichni volají do
checkDiagonaluspět vrátit true. - V
checkDiagonal(mat x y)porovnatmat[i][j]namat[x][y]pro každéhoi = x+1 j = y+1zatímcoi < n && j < m; vraťte hodnotu false při první neshodě, jinak vraťte hodnotu true po dosažení okraje.
Níže je uvedeno implementace:
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'); }
Výstup
Yes
[Očekávaný přístup - 2] - Kontrola diagonálně nad prvkem - O(n * n) Čas a O(1) Prostor
Cílem je naskenovat každou buňku od druhého řádku a druhého sloupce dále a porovnat každou hodnotu s jejím sousedem vlevo nahoře. Pokud se jakýkoli prvek liší od prvku diagonálně nad ním, zjistili jste porušení Toeplitz vlastnosti a můžete okamžitě přestat; pokud projdete celou maticí bez nesouladu, je každá úhlopříčka konstantní.
Postupujte podle níže uvedených kroků:
- Nechat
n = mat.size()am = mat[0].size(). - Iterovat
iod 1 don - 1a v rámci tohojod 1 dom - 1. - Li
mat[i][j] != mat[i - 1][j - 1]v libovolném bodě vrátitfalse. - Jakmile budou všechny páry zkontrolovány, bez neshod se vrátí
true.
Níže je uvedeno implementace:
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'); }
Výstup
Yes
[Alternativní přístup] - Použití hašování - O(n * n) Čas a O(n) Prostor
Cílem je přiřadit jedinečný identifikátor každé diagonále dolů (index řádku mínus index sloupce) a pomocí hash mapy zaznamenat první hodnotu, která se pro tuto diagonálu zobrazí. Když skenujete celou matici, vypočítáte tento klíč pro každou buňku a buď ověříte, že odpovídá uložené hodnotě, nebo pokud je nový, uložte jej. Jediný nesoulad vám umožní zachránit falešné; jinak na konci uzavřeš pravdu.
Postupujte podle níže uvedených kroků:
pole vs seznam polí
- Určete rozměry matice (počet řádků a počet sloupců) z
mat. - Vytvořte prázdnou hashmapu
mpmapovat každý diagonální klíč na jeho reprezentativní hodnotu. - Projděte každou buňku dovnitř
matpodle jeho řádkového indexuia index sloupcůj. - Pro každou buňku vytvořte diagonální klíč odečtením
jzi. - Li
mpjiž drží tuto klávesu porovnejte aktuální prvek s uloženou hodnotou; pokud se liší, okamžitě vraťte false. - Pokud klíč ještě není zasunutý
mpzaznamenejte aktuální prvek pod tímto klíčem. - Pokud dokončíte předávání bez jakékoli neshody, vrátí hodnotu true.
Ilustrace:
Níže uvedený diagram poskytuje lepší vizualizaci této myšlenky. Zvažte úhlopříčku zbarvenou žlutě. Rozdíl mezi hodnotou x a hodnotou y libovolného indexu na této diagonále je 2 (2-0 3-1 4-2 5-3). Totéž lze pozorovat u všech úhlopříček těla.
Pro červenou barvu je rozdíl úhlopříčky 3. Pro zelenou je rozdíl úhlopříčky 0. Pro oranžovou je rozdíl -2 a tak dále...
Níže je uvedeno implementace:
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'); }
Výstup
Yes
