二进制矩阵中的唯一单元格
给定一个大小为 n × m 的矩阵,由 0 和 1 组成。我们需要找到值为 1 的唯一单元格的数量,使得对应的整行和整列没有另一个 1。返回唯一单元格的数量。
例子:
Input : mat[][] = {0, 1, 0, 0
0, 0, 1, 0
1, 0, 0, 1}
Answer : 2
The two 1s that are unique
in their rows and columns
are highlighted.
Input : mat[][] = {
{0, 0, 0, 0, 0, 0, 1}
{0, 1, 0, 0, 0, 0, 0}
{0, 0, 0, 0, 0, 1, 0}
{1, 0, 0, 0, 0, 0, 0}
{0, 0, 1, 0, 0, 0, 1}
Output : 3
方法1-蛮力方法
在这种方法中,我们将检查每个值为 1 的单元格对应的行是否满足我们的要求。我们将检查值为 1 的每个单元格的相应行和列。
C++
// C++ program to count unique cells in
// a matrix
#include
using namespace std;
const int MAX = 100;
// Returns true if mat[i][j] is unique
bool isUnique(int mat[][MAX], int i, int j,
int n, int m)
{
// checking in row calculating sumrow
// will be moving column wise
int sumrow = 0;
for (int k = 0; k < m; k++) {
sumrow += mat[i][k];
if (sumrow > 1)
return false;
}
// checking in column calculating sumcol
// will be moving row wise
int sumcol = 0;
for (int k = 0; k < n; k++) {
sumcol += mat[k][j];
if (sumcol > 1)
return false;
}
return true;
}
int countUnique(int mat[][MAX], int n, int m)
{
int uniquecount = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i][j] &&
isUnique(mat, i, j, n, m))
uniquecount++;
return uniquecount;
}
// Driver code
int main()
{
int mat[][MAX] = {{0, 1, 0, 0},
{0, 0, 1, 0},
{1, 0, 0, 1}};
cout << countUnique(mat, 3, 4);
return 0;
}
Java
// Efficient Java program to count unique
// cells in a binary matrix
class GFG {
static final int MAX = 100;
// Returns true if mat[i][j] is unique
static boolean isUnique(int mat[][], int i, int j,
int n, int m)
{
// checking in row calculating sumrow
// will be moving column wise
int sumrow = 0;
for (int k = 0; k < m; k++) {
sumrow += mat[i][k];
if (sumrow > 1)
return false;
}
// checking in column calculating sumcol
// will be moving row wise
int sumcol = 0;
for (int k = 0; k < n; k++) {
sumcol += mat[k][j];
if (sumcol > 1)
return false;
}
return true;
}
static int countUnique(int mat[][], int n, int m)
{
int uniquecount = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i][j]!=0 &&
isUnique(mat, i, j, n, m))
uniquecount++;
return uniquecount;
}
// Driver code
static public void main(String[] args) {
int mat[][] = {{0, 1, 0, 0},
{0, 0, 1, 0},
{1, 0, 0, 1}};
System.out.print(countUnique(mat, 3, 4));
}
}
// This code is contributed by Rajput-Ji
Python3
# Python3 program to count unique cells in
# a matrix
MAX = 100
# Returns true if mat[i][j] is unique
def isUnique(mat, i, j, n, m):
# checking in row calculating sumrow
# will be moving column wise
sumrow = 0
for k in range(m):
sumrow += mat[i][k]
if (sumrow > 1):
return False
# checking in column calculating sumcol
# will be moving row wise
sumcol = 0
for k in range(n):
sumcol += mat[k][j]
if (sumcol > 1):
return False
return True
def countUnique(mat, n, m):
uniquecount = 0
for i in range(n):
for j in range(m):
if (mat[i][j] and isUnique(mat, i, j, n, m)):
uniquecount += 1
return uniquecount
# Driver code
mat = [[0, 1, 0, 0],
[0, 0, 1, 0],
[1, 0, 0, 1]]
print(countUnique(mat, 3, 4))
# This code is contributed by mohit kumar 29
C#
// Efficient C# program to count unique
// cells in a binary matrix
using System;
public class GFG {
static readonly int MAX = 100;
// Returns true if mat[i][j] is unique
static bool isUnique(int [,]mat, int i, int j,
int n, int m)
{
// checking in row calculating sumrow
// will be moving column wise
int sumrow = 0;
for (int k = 0; k < m; k++) {
sumrow += mat[i,k];
if (sumrow > 1)
return false;
}
// checking in column calculating sumcol
// will be moving row wise
int sumcol = 0;
for (int k = 0; k < n; k++) {
sumcol += mat[k,j];
if (sumcol > 1)
return false;
}
return true;
}
static int countUnique(int [,]mat, int n, int m)
{
int uniquecount = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i,j]!=0 &&
isUnique(mat, i, j, n, m))
uniquecount++;
return uniquecount;
}
// Driver code
static public void Main() {
int [,]mat = {{0, 1, 0, 0},
{0, 0, 1, 0},
{1, 0, 0, 1}};
Console.Write(countUnique(mat, 3, 4));
}
}
// This code is contributed by Rajput-Ji
PHP
1)
return false;
}
// checking in column
// calculating sumcol
// will be moving row wise
$sumcol = 0;
for ($k = 0; $k < $n; $k++)
{
$sumcol += $mat[$k][$j];
if ($sumcol > 1)
return false;
}
return true;
}
function countUnique($mat, $n, $m)
{
$uniquecount = 0;
for ($i = 0; $i < $n; $i++)
for ($j = 0; $j < $m; $j++)
if ($mat[$i][$j] &&
isUnique($mat, $i,
$j, $n, $m))
$uniquecount++;
return $uniquecount;
}
// Driver code
$mat = array(array(0, 1, 0, 0),
array(0, 0, 1, 0),
array(1, 0, 0, 1));
echo countUnique($mat, 3, 4);
// This code is contributed by ajit
?>
Javascript
C++
// Efficient C++ program to count unique
// cells in a binary matrix
#include
using namespace std;
const int MAX = 100;
int countUnique(int mat[][MAX], int n, int m)
{
int rowsum[n], colsum[m];
memset(colsum, 0, sizeof(colsum));
memset(rowsum, 0, sizeof(rowsum));
// Count number of 1s in each row
// and in each column
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i][j])
{
rowsum[i]++;
colsum[j]++;
}
// Using above count arrays, find
// cells
int uniquecount = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i][j] &&
rowsum[i] == 1 &&
colsum[j] == 1)
uniquecount++;
return uniquecount;
}
// Driver code
int main()
{
int mat[][MAX] = {{0, 1, 0, 0},
{0, 0, 1, 0},
{1, 0, 0, 1}};
cout << countUnique(mat, 3, 4);
return 0;
}
Java
// Efficient Java program to count unique
// cells in a binary matrix
class GFG
{
static int MAX = 100;
static int countUnique(int mat[][], int n, int m)
{
int []rowsum = new int[n];
int []colsum = new int[m];
// Count number of 1s in each row
// and in each column
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i][j] != 0)
{
rowsum[i]++;
colsum[j]++;
}
// Using above count arrays, find
// cells
int uniquecount = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i][j] != 0 &&
rowsum[i] == 1 &&
colsum[j] == 1)
uniquecount++;
return uniquecount;
}
// Driver code
public static void main(String[] args)
{
int mat[][] = {{0, 1, 0, 0},
{0, 0, 1, 0},
{1, 0, 0, 1}};
System.out.print(countUnique(mat, 3, 4));
}
}
// This code is contributed by Rajput-Ji
Python3
# Efficient Python3 program to count unique
# cells in a binary matrix
MAX = 100;
def countUnique(mat, n, m):
rowsum = [0] * n;
colsum = [0] * m;
# Count number of 1s in each row
# and in each column
for i in range(n):
for j in range(m):
if (mat[i][j] != 0):
rowsum[i] += 1;
colsum[j] += 1;
# Using above count arrays,
# find cells
uniquecount = 0;
for i in range(n):
for j in range(m):
if (mat[i][j] != 0 and
rowsum[i] == 1 and
colsum[j] == 1):
uniquecount += 1;
return uniquecount;
# Driver code
if __name__ == '__main__':
mat = [ 0, 1, 0, 0 ],
[ 0, 0, 1, 0 ],
[ 1, 0, 0, 1 ];
print(countUnique(mat, 3, 4));
# This code is contributed by 29AjayKumar
C#
// Efficient C# program to count unique
// cells in a binary matrix
using System;
class GFG
{
static int MAX = 100;
static int countUnique(int [,]mat,
int n, int m)
{
int []rowsum = new int[n];
int []colsum = new int[m];
// Count number of 1s in each row
// and in each column
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i, j] != 0)
{
rowsum[i]++;
colsum[j]++;
}
// Using above count arrays, find
// cells
int uniquecount = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i, j] != 0 &&
rowsum[i] == 1 &&
colsum[j] == 1)
uniquecount++;
return uniquecount;
}
// Driver code
public static void Main(String[] args)
{
int [,]mat = {{0, 1, 0, 0},
{0, 0, 1, 0},
{1, 0, 0, 1}};
Console.Write(countUnique(mat, 3, 4));
}
}
// This code is contributed by Rajput-Ji
Javascript
输出:
2
时间复杂度: O((n*m)*(n+m))
由于每个相应的行和列的检查条件,这将达到三次的顺序
方法 2- O(n*m) 方法
在这种方法中,我们将为rowsum数组和colsum数组使用额外的空间,然后检查每个值为1的单元格对应的rowsum数组和colsum数组的值是否为1。
C++
// Efficient C++ program to count unique
// cells in a binary matrix
#include
using namespace std;
const int MAX = 100;
int countUnique(int mat[][MAX], int n, int m)
{
int rowsum[n], colsum[m];
memset(colsum, 0, sizeof(colsum));
memset(rowsum, 0, sizeof(rowsum));
// Count number of 1s in each row
// and in each column
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i][j])
{
rowsum[i]++;
colsum[j]++;
}
// Using above count arrays, find
// cells
int uniquecount = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i][j] &&
rowsum[i] == 1 &&
colsum[j] == 1)
uniquecount++;
return uniquecount;
}
// Driver code
int main()
{
int mat[][MAX] = {{0, 1, 0, 0},
{0, 0, 1, 0},
{1, 0, 0, 1}};
cout << countUnique(mat, 3, 4);
return 0;
}
Java
// Efficient Java program to count unique
// cells in a binary matrix
class GFG
{
static int MAX = 100;
static int countUnique(int mat[][], int n, int m)
{
int []rowsum = new int[n];
int []colsum = new int[m];
// Count number of 1s in each row
// and in each column
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i][j] != 0)
{
rowsum[i]++;
colsum[j]++;
}
// Using above count arrays, find
// cells
int uniquecount = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i][j] != 0 &&
rowsum[i] == 1 &&
colsum[j] == 1)
uniquecount++;
return uniquecount;
}
// Driver code
public static void main(String[] args)
{
int mat[][] = {{0, 1, 0, 0},
{0, 0, 1, 0},
{1, 0, 0, 1}};
System.out.print(countUnique(mat, 3, 4));
}
}
// This code is contributed by Rajput-Ji
Python3
# Efficient Python3 program to count unique
# cells in a binary matrix
MAX = 100;
def countUnique(mat, n, m):
rowsum = [0] * n;
colsum = [0] * m;
# Count number of 1s in each row
# and in each column
for i in range(n):
for j in range(m):
if (mat[i][j] != 0):
rowsum[i] += 1;
colsum[j] += 1;
# Using above count arrays,
# find cells
uniquecount = 0;
for i in range(n):
for j in range(m):
if (mat[i][j] != 0 and
rowsum[i] == 1 and
colsum[j] == 1):
uniquecount += 1;
return uniquecount;
# Driver code
if __name__ == '__main__':
mat = [ 0, 1, 0, 0 ],
[ 0, 0, 1, 0 ],
[ 1, 0, 0, 1 ];
print(countUnique(mat, 3, 4));
# This code is contributed by 29AjayKumar
C#
// Efficient C# program to count unique
// cells in a binary matrix
using System;
class GFG
{
static int MAX = 100;
static int countUnique(int [,]mat,
int n, int m)
{
int []rowsum = new int[n];
int []colsum = new int[m];
// Count number of 1s in each row
// and in each column
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i, j] != 0)
{
rowsum[i]++;
colsum[j]++;
}
// Using above count arrays, find
// cells
int uniquecount = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mat[i, j] != 0 &&
rowsum[i] == 1 &&
colsum[j] == 1)
uniquecount++;
return uniquecount;
}
// Driver code
public static void Main(String[] args)
{
int [,]mat = {{0, 1, 0, 0},
{0, 0, 1, 0},
{1, 0, 0, 1}};
Console.Write(countUnique(mat, 3, 4));
}
}
// This code is contributed by Rajput-Ji
Javascript
输出:
2
时间复杂度 – O(n*m)
辅助空间 – O(n+m)