Като се има предвид n x n двоична матрица (елементите в матрицата могат да бъдат или 1 или 0), където всеки ред и колона на матрицата са сортирани във възходящ брой на броя на поръчките от 0s, присъстващи в него.
Примери:
Вход:
[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]
Резултат: 8
Вход:
[0 0]
[0 0]
Резултат: 4
Вход:
[1 1 1 1]
[1 1 1 1]
[1 1 1 1]
[1 1 1 1]
Резултат:
Идеята е много проста. Започваме от долния ляв ъгъл на матрицата и повтаряме стъпките по-долу, докато намерим горния или десния ръб на матрицата.
- Индекс на редици на декремент, докато не намерим 0.
- Добавете брой 0s в текущата колона, т.е. индекс на текущия ред + 1 към резултата и се преместете точно до следващата колона (индекс на увеличение на COL с 1).
Горната логика ще работи, тъй като матрицата е сортирана с редици и колони. Логиката ще работи и за всяка матрица, съдържаща неотрицателни цели числа.
По -долу е прилагането на горната идея:
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));
Изход
8
Сложност на времето на горния разтвор е o (n), тъй като решението следва единичен път от долния ляв ъгъл до горния или десния ръб на матрицата.
Спомагателно пространство Използва се от програмата е O (1). Тъй като не е взето допълнително пространство.