logo

Compter les zéros dans une matrice triée par ligne et par colonne

Étant donné une matrice binaire n x n (les éléments de la matrice peuvent être 1 ou 0) où chaque ligne et colonne de la matrice est triée par ordre croissant en comptant le nombre de 0 présents.

Exemples :  



panda fondre

Saisir:
[0 0 0 0 1]
[0 0 0 1 1]
[0 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
Sortir: 8

Saisir:
[0 0]
[0 0]
Sortir: 4

Saisir:
[1 1 1 1]
[1 1 1 1]
[1 1 1 1]
[1 1 1 1]
Sortir:

L'idée est très simple. Nous partons du coin inférieur gauche de la matrice et répétons les étapes ci-dessous jusqu'à ce que nous trouvions le bord supérieur ou droit de la matrice.

  1. Décrémentez l’index de ligne jusqu’à ce que nous trouvions un 0. 
  2. Ajoutez le nombre de 0 dans la colonne actuelle, c'est-à-dire l'index de la ligne actuelle + 1 au résultat et passez à droite de la colonne suivante (incrémentez l'index de la colonne de 1).

La logique ci-dessus fonctionnera puisque la matrice est triée par lignes et par colonnes. La logique fonctionnera également pour toute matrice contenant des entiers non négatifs.



Vous trouverez ci-dessous la mise en œuvre de l'idée ci-dessus :

C++
#include    #include  using namespace std; // Function to count number of 0s in the given // row-wise and column-wise sorted binary matrix. int countZeroes(const vector<vector<int>>& mat) {  int n = mat.size();     // start from the bottom-left corner  int row = n - 1 col = 0;  int count = 0;   while (col < n) {    // move up until you find a 0  while (row >= 0 && mat[row][col]) {  row--;  }  // add the number of 0s in the current  // column to the result  count += (row + 1);  // move to the next column  col++;  }  return count; } int main() {  vector<vector<int>> mat = {  { 0 0 0 0 1 }  { 0 0 0 1 1 }  { 0 1 1 1 1 }  { 1 1 1 1 1 }  { 1 1 1 1 1 }  };  cout << countZeroes(mat);  return 0; } 
C
// C program to count number of 0s in the given // row-wise and column-wise sorted binary matrix. #include  // define size of square matrix #define N 5 // Function to count number of 0s in the given // row-wise and column-wise sorted binary matrix. int countZeroes(int mat[N][N]) {  // start from bottom-left corner of the matrix  int row = N - 1 col = 0;  // stores number of zeroes in the matrix  int count = 0;  while (col < N)  {  // move up until you find a 0  while (mat[row][col])  // if zero is not found in current column  // we are done  if (--row < 0)  return count;  // add 0s present in current column to result  count += (row + 1);  // move right to next column  col++;  }  return count; } // Driver Program to test above functions int main() {  int mat[N][N] =  {  { 0 0 0 0 1 }  { 0 0 0 1 1 }  { 0 1 1 1 1 }  { 1 1 1 1 1 }  { 1 1 1 1 1 }  };    printf('%d'countZeroes(mat));  return 0; } 
Java
import java.util.Arrays; public class GfG {    // Function to count number of 0s in the given  // row-wise and column-wise sorted binary matrix.  public static int countZeroes(int[][] mat) {  int n = mat.length;    // start from the bottom-left corner  int row = n - 1 col = 0;  int count = 0;  while (col < n) {    // move up until you find a 0  while (row >= 0 && mat[row][col] == 1) {  row--;  }  // add the number of 0s in the current  // column to the result  count += (row + 1);  // move to the next column  col++;  }  return count;  }  public static void main(String[] args) {  int[][] mat = {  { 0 0 0 0 1 }  { 0 0 0 1 1 }  { 0 1 1 1 1 }  { 1 1 1 1 1 }  { 1 1 1 1 1 }  };  System.out.println(countZeroes(mat));  } } 
Python
# Function to count number of 0s in the given # row-wise and column-wise sorted binary matrix. def count_zeroes(mat): n = len(mat) # start from the bottom-left corner row = n - 1 col = 0 count = 0 while col < n: # move up until you find a 0 while row >= 0 and mat[row][col]: row -= 1 # add the number of 0s in the current # column to the result count += (row + 1) # move to the next column col += 1 return count if __name__ == '__main__': mat = [ [0 0 0 0 1] [0 0 0 1 1] [0 1 1 1 1] [1 1 1 1 1] [1 1 1 1 1] ] print(count_zeroes(mat)) 
C#
// Function to count number of 0s in the given // row-wise and column-wise sorted binary matrix. using System; using System.Collections.Generic; class Program {  static int CountZeroes(int[] mat) {  int n = mat.GetLength(0);    // start from the bottom-left corner  int row = n - 1 col = 0;  int count = 0;  while (col < n) {    // move up until you find a 0  while (row >= 0 && mat[row col] == 1) {  row--;  }    // add the number of 0s in the current  // column to the result  count += (row + 1);    // move to the next column  col++;  }  return count;  }  static void Main() {  int[] mat = {  { 0 0 0 0 1 }  { 0 0 0 1 1 }  { 0 1 1 1 1 }  { 1 1 1 1 1 }  { 1 1 1 1 1 }  };  Console.WriteLine(CountZeroes(mat));  } } 
JavaScript
// Function to count number of 0s in the given // row-wise and column-wise sorted binary matrix. function countZeroes(mat) {  const n = mat.length;    // start from the bottom-left corner  let row = n - 1 col = 0;  let count = 0;  while (col < n) {    // move up until you find a 0  while (row >= 0 && mat[row][col]) {  row--;  }    // add the number of 0s in the current  // column to the result  count += (row + 1);    // move to the next column  col++;  }  return count; } const mat = [  [0 0 0 0 1]  [0 0 0 1 1]  [0 1 1 1 1]  [1 1 1 1 1]  [1 1 1 1 1] ]; console.log(countZeroes(mat)); 

Sortir
8

Complexité temporelle de la solution ci-dessus est O(n) puisque la solution suit un seul chemin du coin inférieur gauche au bord supérieur ou droit de la matrice. 
Espace auxiliaire utilisé par le programme est O(1). puisqu'aucun espace supplémentaire n'a été pris.



renard ou loup