Подматрица заданного размера с максимумом единиц
Учитывая двоичную матрицу mat [] [] и целое число K , задача состоит в том, чтобы найти подматрицу размера K * K, такую, чтобы она содержала максимальное количество единиц в матрице.
Примеры:
Input: mat[][] = {{1, 0, 1}, {1, 1, 0}, {1, 0, 0}}, K = 2
Output: 3
Explanation:
In the given matrix, there are 4 sub-matrix of order 2*2,
|1 0| |0 1| |1 1| |1 0|
|1 1|, |1 0|, |1 0|, |0 0|
Out of these sub-matrix, two matrix contains 3, 1’s.Input: mat[][] = {{1, 0}, {0, 1}}, K = 1
Output: 1
Explanation:
In the given matrix, there are 4 sub-matrix of order 1*1,
|1|, |0|, |1|, |0|
Out of these sub-matrix, two matrix contains 1, 1’s.
Подход: идея состоит в том, чтобы использовать метод скользящего окна для решения этой проблемы. В этом методе мы обычно вычисляем значение одного окна, а затем перемещаем окно одно за другим, чтобы вычислить решение для каждого окна размера K.
Чтобы вычислить подматрицу максимальной единицы, подсчитайте количество единиц в строке для каждого возможного окна размера K, используя технику скользящего окна, и сохраните количество единиц в форме матрицы.
Например:
Пусть матрица имеет вид {{1,0,1}, {1, 1, 0}} и K = 2
Для строки 1 -
Подмассив 1: (1, 0), количество 1 = 1
Подмассив 2: (0, 1), количество 1 = 1
Для строки 2 -
Подмассив 1: (1, 1), количество 1 = 2
Подмассив 2: (1, 0), количество 1 = 1
Тогда окончательная матрица для подсчета единиц будет -
[1, 1]
[2, 1]Точно так же примените метод скользящего окна к каждому столбцу этой матрицы, чтобы вычислить количество единиц в каждой возможной подматрице и извлечь максимум из этих подсчетов.
Below is the implementation of the above approach:
C++
// C++ implementation to find the// maximum count of 1"s in// submatrix of order K#include <bits/stdc++.h>using namespace std;// Function to find the maximum// count of 1"s in the// submatrix of order Kint maxCount(vector<vector<int>> &mat, int k) { int n = mat.size(); int m = mat[0].size(); vector<vector<int>> a; // Loop to find the count of 1"s // in every possible windows // of rows of matrix for (int e = 0; e < n; ++e){ vector<int> s = mat[e]; vector<int> q; int c = 0; // Loop to find the count of // 1"s in the first window int i; for (i = 0; i < k; ++i) if(s[i] == 1) c += 1; q.push_back(c); int p = s[0]; // Loop to find the count of // 1"s in the remaining windows for (int j = i + 1; j < m; ++j) { if(s[j] == 1) c+= 1; if(p == 1) c-= 1; q.push_back(c); p = s[j-k + 1]; } a.push_back(q); } vector<vector<int>> b; int max = 0; // Loop to find the count of 1"s // in every possible submatrix for (int i = 0; i < a[0].size(); ++i) { int c = 0; int p = a[0][i]; // Loop to find the count of // 1"s in the first window int j; for (j = 0; j < k; ++j) { c+= a[j][i]; } vector<int> q; if (c>max) max = c; q.push_back(c); // Loop to find the count of // 1"s in the remaining windows for (int l = j + 1; j < n; ++j) { c+= a[l][i]; c-= p; p = a[l-k + 1][i]; q.push_back(c); if (c > max) max = c; } b.push_back(q); } return max;}// Driver codeint main(){ vector<vector<int>> mat = {{1, 0, 1}, {1, 1, 0}, {0, 1, 0}}; int k = 3; // Function call cout<< maxCount(mat, k); return 0;} |
Java
// Java implementation to find the// maximum count of 1"s in// submatrix of order Kimport java.io.*;import java.util.*;class GFG{// Function to find the maximum// count of 1"s in the// submatrix of order Kstatic int maxCount(ArrayList<ArrayList<Integer> > mat, int k){ int n = mat.size(); int m = mat.get(0).size(); ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>(); // Loop to find the count of 1"s // in every possible windows // of rows of matrix for(int e = 0; e < n; ++e) { ArrayList<Integer> s = mat.get(e); ArrayList<Integer> q = new ArrayList<Integer>(); int c = 0; // Loop to find the count of // 1"s in the first window int i; for(i = 0; i < k; ++i) { if (s.get(i) == 1) { c += 1; } } q.add(c); int p = s.get(0); // Loop to find the count of // 1"s in the remaining windows for(int j = i + 1; j < m; ++j) { if (s.get(j) == 1) { c += 1; } if (p == 1) { c -= 1; } q.add(c); p = s.get(j - k + 1); } a.add(q); } ArrayList<ArrayList<Integer>> b = new ArrayList<ArrayList<Integer>>(); int max = 0; // Loop to find the count of 1"s // in every possible submatrix for(int i = 0; i < a.get(0).size(); ++i) { int c = 0; int p = a.get(0).get(i); // Loop to find the count of // 1"s in the first window int j; for(j = 0; j < k; ++j) { c += a.get(j).get(i); } ArrayList<Integer> q = new ArrayList<Integer>(); if (c > max) { max = c; } q.add(c); // Loop to find the count of // 1"s in the remaining windows for(int l = j + 1; j < n; ++j) { c += a.get(l).get(i); c -= p; p = a.get(l - k + 1).get(i); q.add(c); if (c > max) { max = c; } } b.add(q); } return max;}// Driver codepublic static void main(String[] args){ ArrayList<ArrayList<Integer>> mat = new ArrayList<ArrayList<Integer>>(); mat.add(new ArrayList<Integer>(Arrays.asList(1, 0, 1))); mat.add(new ArrayList<Integer>(Arrays.asList(1, 1, 0))); mat.add(new ArrayList<Integer>(Arrays.asList(0, 1, 0))); int k = 3; // Function call System.out.println(maxCount(mat, k));}}// This code is contributed by avanitrachhadiya2155 |
Python3
# Python3 implementation to find the# maximum count of 1"s in# submatrix of order K# Function to find the maximum# count of 1"s in the# submatrix of order Kdef maxCount(mat, k): n, m = len(mat), len(mat[0]) a =[] # Loop to find the count of 1"s # in every possible windows # of rows of matrix for e in range(n): s = mat[e] q =[] c = 0 # Loop to find the count of # 1"s in the first window for i in range(k): if s[i] == 1: c += 1 q.append(c) p = s[0] # Loop to find the count of # 1"s in the remaining windows for j in range(i + 1, m): if s[j]==1: c+= 1 if p ==1: c-= 1 q.append(c) p = s[j-k + 1] a.append(q) b =[] max = 0 # Loop to find the count of 1"s # in every possible submatrix for i in range(len(a[0])): c = 0 p = a[0][i] # Loop to find the count of # 1"s in the first window for j in range(k): c+= a[j][i] q =[] if c>max: max = c q.append(c) # Loop to find the count of # 1"s in the remaining windows for l in range(j + 1, n): c+= a[l][i] c-= p p = a[l-k + 1][i] q.append(c) if c > max: max = c b.append(q) return max # Driver Codeif __name__ == "__main__": mat = [[1, 0, 1], [1, 1, 0], [0, 1, 0]] k = 3 # Function call print(maxCount(mat, k)) |
C#
// C# implementation to find the// maximum count of 1"s in// submatrix of order Kusing System;using System.Collections.Generic;class GFG{ // Function to find the maximum// count of 1"s in the// submatrix of order Kstatic int maxCount(List<List<int>> mat, int k){ int n = mat.Count; int m = mat[0].Count; List<List<int>> a = new List<List<int>>(); // Loop to find the count of 1"s // in every possible windows // of rows of matrix for(int e = 0; e < n; ++e) { List<int> s = mat[e]; List<int> q = new List<int>(); int c = 0; // Loop to find the count of // 1"s in the first window int i; for(i = 0; i < k; ++i) { if (s[i] == 1) { c++; } } q.Add(c); int p = s[0]; // Loop to find the count of // 1"s in the remaining windows for(int j = i + 1; j < m; ++j) { if (s[j] == 1) { c++; } if (p == 1) { &nb
РЕКОМЕНДУЕМЫЕ СТАТЬИ |