本文概述
- 建议:在继续解决方案之前, 请先在"实践"上解决它。
- C ++
- Java
- Python3
- C#
- 的PHP
- C ++
- Java
- Python3
- C#
- 的PHP
Example 1The matrix1 00 0should be changed to following1 11 0Example 2The matrix0 0 00 0 1should be changed to following0 0 11 1 1Example 3The matrix1 0 0 10 0 1 00 0 0 0should be changed to following1 1 1 11 1 1 11 0 1 1
推荐:请在"实践首先, 在继续解决方案之前。
方法1(使用两个临时数组)
1)创建两个临时数组row [M]和col [N]。将row []和col []的所有值初始化为0。
2)遍历输入矩阵mat [M] [N]。如果看到输入mat [i] [j]为true, 则将row [i]和col [j]标记为true。
3)再次遍历输入矩阵mat [M] [N]。对于每个入口mat [i] [j], 检查row [i]和col [j]的值。如果两个值(row [i]或col [j])中的任何一个为true, 则将mat [i] [j]标记为true。
感谢Dixit Sethi建议这种方法。
C ++
// C++ Code For A Boolean Matrix Question
#include <
bits/stdc++.h>
using namespace std;
#define R 3
#define C 4void modifyMatrix( bool mat[R][C])
{
bool row[R];
bool col[C];
int i, j;
/* Initialize all values of row[] as 0 */
for (i = 0;
i <
R;
i++)
{
row[i] = 0;
}/* Initialize all values of col[] as 0 */
for (i = 0;
i <
C;
i++)
{
col[i] = 0;
}// Store the rows and columns to be marked as
// 1 in row[] and col[] arrays respectively
for (i = 0;
i <
R;
i++)
{
for (j = 0;
j <
C;
j++)
{
if (mat[i][j] == 1)
{
row[i] = 1;
col[j] = 1;
}
}
}// Modify the input matrix mat[] using the
// above constructed row[] and col[] arrays
for (i = 0;
i <
R;
i++)
{
for (j = 0;
j <
C;
j++)
{
if ( row[i] == 1 || col[j] == 1 )
{
mat[i][j] = 1;
}
}
}
}/* A utility function to print a 2D matrix */
void printMatrix( bool mat[R][C])
{
int i, j;
for (i = 0;
i <
R;
i++)
{
for (j = 0;
j <
C;
j++)
{
cout <
<
mat[i][j];
}
cout <
<
endl;
}
}// Driver Code
int main()
{
bool mat[R][C] = { {1, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 0, 0}};
cout <
<
"Input Matrix \n" ;
printMatrix(mat);
modifyMatrix(mat);
printf ( "Matrix after modification \n" );
printMatrix(mat);
return 0;
}// This code is contributed
// by Akanksha Rai(Abby_akku)
Java
// Java Code For A Boolean Matrix Question
class GFG
{
public static void modifyMatrix( int mat[ ][ ], int R, int C)
{
int row[ ]= new int [R];
int col[ ]= new int [C];
int i, j;
/* Initialize all values of row[] as 0 */
for (i = 0 ;
i <
R;
i++)
{
row[i] = 0 ;
}/* Initialize all values of col[] as 0 */
for (i = 0 ;
i <
C;
i++)
{
col[i] = 0 ;
}/* Store the rows and columns to be marked as
1 in row[] and col[] arrays respectively */
for (i = 0 ;
i <
R;
i++)
{
for (j = 0 ;
j <
C;
j++)
{
if (mat[i][j] == 1 )
{
row[i] = 1 ;
col[j] = 1 ;
}
}
}/* Modify the input matrix mat[] using the
above constructed row[] and col[] arrays */
for (i = 0 ;
i <
R;
i++)
{
for (j = 0 ;
j <
C;
j++)
{
if ( row[i] == 1 || col[j] == 1 )
{
mat[i][j] = 1 ;
}
}
}
}/* A utility function to print a 2D matrix */
public static void printMatrix( int mat[ ][ ], int R, int C)
{
int i, j;
for (i = 0 ;
i <
R;
i++)
{
for (j = 0 ;
j <
C;
j++)
{
System.out.print(mat[i][j]+ " " );
}
System.out.println();
}
}/* Driver program to test above functions */
public static void main(String[] args)
{
int mat[ ][ ] = { { 1 , 0 , 0 , 1 }, { 0 , 0 , 1 , 0 }, { 0 , 0 , 0 , 0 }, };
System.out.println( "Matrix Intially" );
printMatrix(mat, 3 , 4 );
modifyMatrix(mat, 3 , 4 );
System.out.println( "Matrix after modification n" );
printMatrix(mat, 3 , 4 );
} }// This code is contributed by Kamal Rawal
Python3
# Python3 Code For A Boolean Matrix Question
R = 3
C = 4def modifyMatrix(mat):
row = [ 0 ] * R
col = [ 0 ] * C # Initialize all values of row[] as 0
for i in range ( 0 , R):
row[i] = 0# Initialize all values of col[] as 0
for i in range ( 0 , C) :
col[i] = 0# Store the rows and columns to be marked
# as 1 in row[] and col[] arrays respectively
for i in range ( 0 , R) :for j in range ( 0 , C) :
if (mat[i][j] = = 1 ) :
row[i] = 1
col[j] = 1# Modify the input matrix mat[] using the
# above constructed row[] and col[] arrays
for i in range ( 0 , R) :for j in range ( 0 , C):
if ( row[i] = = 1 or col[j] = = 1 ) :
mat[i][j] = 1# A utility function to print a 2D matrix
def printMatrix(mat) :
for i in range ( 0 , R):for j in range ( 0 , C) :
print (mat[i][j], end = " " )
print ()# Driver Code
mat = [ [ 1 , 0 , 0 , 1 ], [ 0 , 0 , 1 , 0 ], [ 0 , 0 , 0 , 0 ] ] print ( "Input Matrix n" )
printMatrix(mat)modifyMatrix(mat)print ( "Matrix after modification n" )
printMatrix(mat)# This code is contributed by Nikita Tiwari.
C#
// C# Code For A Boolean
// Matrix Question
using System;
class GFG
{
public static void modifyMatrix( int [, ]mat, int R, int C)
{
int []row = new int [R];
int []col = new int [C];
int i, j;
/* Initialize all values
of row[] as 0 */
for (i = 0;
i <
R;
i++)
{
row[i] = 0;
}/* Initialize all values
of col[] as 0 */
for (i = 0;
i <
C;
i++)
{
col[i] = 0;
}/* Store the rows and columns
to be marked as 1 in row[]
and col[] arrays respectively */
for (i = 0;
i <
R;
i++)
{
for (j = 0;
j <
C;
j++)
{
if (mat[i, j] == 1)
{
row[i] = 1;
col[j] = 1;
}
}
}/* Modify the input matrix
mat[] using the above
constructed row[] and
col[] arrays */
for (i = 0;
i <
R;
i++)
{
for (j = 0;
j <
C;
j++)
{
if (row[i] == 1 || col[j] == 1)
{
mat[i, j] = 1;
}
}
}
}/* A utility function to
print a 2D matrix */
public static void printMatrix( int [, ]mat, int R, int C)
{
int i, j;
for (i = 0;
i <
R;
i++)
{
for (j = 0;
j <
C;
j++)
{
Console.Write(mat[i, j] + " " );
}
Console.WriteLine();
}
}// Driver code
static public void Main ()
{
int [, ]mat = {{1, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 0, 0}};
Console.WriteLine( "Matrix Intially" );
printMatrix(mat, 3, 4);
modifyMatrix(mat, 3, 4);
Console.WriteLine( "Matrix after " +
"modification n" );
printMatrix(mat, 3, 4);
}
}// This code is contributed by ajit
的PHP
<
?php
// PHP Code For A Boolean
// Matrix Question
$R = 3;
$C = 4;
function modifyMatrix(&
$mat )
{
global $R , $C ;
$row = array ();
$col = array ();
/* Initialize all values
of row[] as 0 */
for ( $i = 0;
$i <
$R ;
$i ++)
{
$row [ $i ] = 0;
}/* Initialize all values
of col[] as 0 */
for ( $i = 0;
$i <
$C ;
$i ++)
{
$col [ $i ] = 0;
}/* Store the rows and columns
to be marked as 1 in row[]
and col[] arrays respectively */
for ( $i = 0;
$i <
$R ;
$i ++)
{
for ( $j = 0;
$j <
$C ;
$j ++)
{
if ( $mat [ $i ][ $j ] == 1)
{
$row [ $i ] = 1;
$col [ $j ] = 1;
}
}
}/* Modify the input matrix mat[]
using the above constructed
row[] and col[] arrays */
for ( $i = 0;
$i <
$R ;
$i ++)
{
for ( $j = 0;
$j <
$C ;
$j ++)
{
if ( $row [ $i ] == 1 ||
$col [ $j ] == 1 )
{
$mat [ $i ][ $j ] = 1;
}
}
}
}/* A utility function to
print a 2D matrix */
function printMatrix(&
$mat )
{
global $R , $C ;
for ( $i = 0;
$i <
$R ;
$i ++)
{
for ( $j = 0;
$j <
$C ;
$j ++)
{
echo $mat [ $i ][ $j ] . " " ;
}
echo "\n" ;
}
}// Driver code
$mat = array ( array (1, 0, 0, 1), array (0, 0, 1, 0), array (0, 0, 0, 0));
echo "Input Matrix \n" ;
printMatrix( $mat );
modifyMatrix( $mat );
echo "Matrix after modification \n" ;
printMatrix( $mat );
// This code is contributed
// by ChitraNayal
?>
输出如下:
Input Matrix1 0 0 10 0 1 00 0 0 0Matrix after modification1 1 1 11 1 1 11 0 1 1
时间复杂度:
O(M * N)
辅助空间:
O(M + N)
方法2(方法1的空间优化版本)
该方法是上述方法1的空间优化版本。该方法使用输入矩阵的第一行和第一列代替方法1的辅助数组row []和col []。因此, 我们要做的是:首先注意第一行和第一列, 并将这两个信息存储在两个标志变量rowFlag和colFlag中。获得此信息后, 我们可以将第一行和第一列用作辅助数组, 并将方法1应用于大小为(M-1)*(N-1)的子矩阵(不包括第一行和第一列的矩阵)。
1)扫描第一行并设置一个变量rowFlag以指示是否需要在第一行中设置全1。
2)扫描第一列并设置变量colFlag以指示是否需要在第一列中设置全1。
【算法设计(如何解决布尔矩阵问题(?))】3)分别使用第一行和第一列作为辅助数组row []和col [], 将矩阵视为从第二行和第二列开始的子矩阵, 并应用方法1。
4)最后, 如果需要, 使用rowFlag和colFlag更新第一行和第一列。
时间复杂度:O(M * N)
辅助空间:O(1)
感谢Sidh提出了这种方法。
C ++
#include <
bits/stdc++.h>
using namespace std;
#define R 3
#define C 4void modifyMatrix( int mat[R][C])
{
// variables to check if there are any 1
// in first row and column
bool row_flag = false ;
bool col_flag = false ;
// updating the first row and col if 1
// is encountered
for ( int i = 0;
i <
R;
i++) {
for ( int j = 0;
j <
C;
j++) {
if (i == 0 &
&
mat[i][j] == 1)
row_flag = true ;
if (j == 0 &
&
mat[i][j] == 1)
col_flag = true ;
if (mat[i][j] == 1) {mat[0][j] = 1;
mat[i][0] = 1;
}
}
}// Modify the input matrix mat[] using the
// first row and first column of Matrix mat
for ( int i = 1;
i <
R;
i++) {
for ( int j = 1;
j <
C;
j++) {if (mat[0][j] == 1 || mat[i][0] == 1) {
mat[i][j] = 1;
}
}
}// modify first row if there was any 1
if (row_flag == true ) {
for ( int i = 0;
i <
C;
i++) {
mat[0][i] = 1;
}
}// modify first col if there was any 1
if (col_flag == true ) {
for ( int i = 0;
i <
R;
i++) {
mat[i][0] = 1;
}
}
}/* A utility function to print a 2D matrix */
void printMatrix( int mat[R][C])
{
for ( int i = 0;
i <
R;
i++) {
for ( int j = 0;
j <
C;
j++) {
cout <
<
mat[i][j];
}
cout <
<
"\n" ;
}
}// Driver function to test the above function
int main()
{int mat[R][C] = { { 1, 0, 0, 1 }, { 0, 0, 1, 0 }, { 0, 0, 0, 0 } };
cout <
<
"Input Matrix :\n" ;
printMatrix(mat);
modifyMatrix(mat);
cout <
<
"Matrix After Modification :\n" ;
printMatrix(mat);
return 0;
}// This code is contributed by Nikita Tiwari
Java
class GFG
{
public static void modifyMatrix( int mat[][]){// variables to check if there are any 1
// in first row and column
boolean row_flag = false ;
boolean col_flag = false ;
// updating the first row and col if 1
// is encountered
for ( int i = 0 ;
i <
mat.length;
i++ ){
for ( int j = 0 ;
j <
mat[ 0 ].length;
j++){
if (i == 0 &
&
mat[i][j] == 1 )
row_flag = true ;
if (j == 0 &
&
mat[i][j] == 1 )
col_flag = true ;
if (mat[i][j] == 1 ){mat[ 0 ][j] = 1 ;
mat[i][ 0 ] = 1 ;
}}
}// Modify the input matrix mat[] using the
// first row and first column of Matrix mat
for ( int i = 1 ;
i <
mat.length;
i ++){
for ( int j = 1 ;
j <
mat[ 0 ].length;
j ++){if (mat[ 0 ][j] == 1 || mat[i][ 0 ] == 1 ){
mat[i][j] = 1 ;
}
}
}// modify first row if there was any 1
if (row_flag == true ){
for ( int i = 0 ;
i <
mat[ 0 ].length;
i++){
mat[ 0 ][i] = 1 ;
}
}// modify first col if there was any 1
if (col_flag == true ){
for ( int i = 0 ;
i <
mat.length;
i ++){
mat[i][ 0 ] = 1 ;
}
}
}/* A utility function to print a 2D matrix */
public static void printMatrix( int mat[][]){
for ( int i = 0 ;
i <
mat.length;
i ++){
for ( int j = 0 ;
j <
mat[ 0 ].length;
j ++){
System.out.print( mat[i][j] );
}
System.out.println( "" );
}
}// Driver function to test the above function
public static void main(String args[] ){int mat[][] = {{ 1 , 0 , 0 , 1 }, { 0 , 0 , 1 , 0 }, { 0 , 0 , 0 , 0 }};
System.out.println( "Input Matrix :" );
printMatrix(mat);
modifyMatrix(mat);
System.out.println( "Matrix After Modification :" );
printMatrix(mat);
}
}// This code is contributed by Arnav Kr. Mandal.
Python3
# Python3 Code For A Boolean Matrix Question
def modifyMatrix(mat) :# variables to check if there are any 1
# in first row and column
row_flag = False
col_flag = False# updating the first row and col
# if 1 is encountered
for i in range ( 0 , len (mat)) :for j in range ( 0 , len (mat)) :
if (i = = 0 and mat[i][j] = = 1 ) :
row_flag = Trueif (j = = 0 and mat[i][j] = = 1 ) :
col_flag = Trueif (mat[i][j] = = 1 ) :
mat[ 0 ][j] = 1
mat[i][ 0 ] = 1# Modify the input matrix mat[] using the
# first row and first column of Matrix mat
for i in range ( 1 , len (mat)) :for j in range ( 1 , len (mat) + 1 ) :
if (mat[ 0 ][j] = = 1 or mat[i][ 0 ] = = 1 ) :
mat[i][j] = 1# modify first row if there was any 1
if (row_flag = = True ) :
for i in range ( 0 , len (mat)) :
mat[ 0 ][i] = 1# modify first col if there was any 1
if (col_flag = = True ) :
for i in range ( 0 , len (mat)) :
mat[i][ 0 ] = 1# A utility function to print a 2D matrix
def printMatrix(mat) :for i in range ( 0 , len (mat)) :
for j in range ( 0 , len (mat) + 1 ) :
print ( mat[i][j], end = "" )print ()# Driver Code
mat = [ [ 1 , 0 , 0 , 1 ], [ 0 , 0 , 1 , 0 ], [ 0 , 0 , 0 , 0 ] ]print ( "Input Matrix :" )
printMatrix(mat)modifyMatrix(mat)print ( "Matrix After Modification :" )
printMatrix(mat)# This code is contributed by Nikita tiwari.
C#
// C# Code For A Boolean
// Matrix Question
using System;
class GFG
{
public static void modifyMatrix( int [, ] mat)
{// variables to check
// if there are any 1
// in first row and column
bool row_flag = false ;
bool col_flag = false ;
// updating the first
// row and col if 1
// is encountered
for ( int i = 0;
i <
mat.GetLength(0);
i++ )
{
for ( int j = 0;
j <
mat.GetLength(1);
j++)
{
if (i == 0 &
&
mat[i, j] == 1)
row_flag = true ;
if (j == 0 &
&
mat[i, j] == 1)
col_flag = true ;
if (mat[i, j] == 1)
{
mat[0, j] = 1;
mat[i, 0] = 1;
}}
}// Modify the input matrix mat[]
// using the first row and first
// column of Matrix mat
for ( int i = 1;
i <
mat.GetLength(0);
i ++)
{
for ( int j = 1;
j <
mat.GetLength(1);
j ++)
{if (mat[0, j] == 1 ||
mat[i, 0] == 1)
{
mat[i, j] = 1;
}
}
}// modify first row
// if there was any 1
if (row_flag == true )
{
for ( int i = 0;
i <
mat.GetLength(1);
i++)
{
mat[0, i] = 1;
}
}// modify first col if
// there was any 1
if (col_flag == true )
{
for ( int i = 0;
i <
mat.GetLength(0);
i ++)
{
mat[i, 0] = 1;
}
}
}/* A utility function
to print a 2D matrix */
public static void printMatrix( int [, ] mat)
{
for ( int i = 0;
i <
mat.GetLength(0);
i ++)
{
for ( int j = 0;
j <
mat.GetLength(1);
j ++)
{
Console.Write(mat[i, j] + " " );
}
Console.Write( "\n" );
}
}// Driver Code
public static void Main()
{
int [, ] mat = {{1, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 0, 0}};
Console.Write( "Input Matrix :\n" );
printMatrix(mat);
modifyMatrix(mat);
Console.Write( "Matrix After " +
"Modification :\n" );
printMatrix(mat);
}
}// This code is contributed
// by ChitraNayal
的PHP
<
?php
// PHP Code For A Boolean
// Matrix Question
$R = 3;
$C = 4;
function modifyMatrix(&
$mat )
{
global $R , $C ;
// variables to check if
// there are any 1 in
// first row and column
$row_flag = false;
$col_flag = false;
// updating the first
// row and col if 1
// is encountered
for ( $i = 0;
$i <
$R ;
$i ++)
{
for ( $j = 0;
$j <
$C ;
$j ++)
{
if ( $i == 0 &
&
$mat [ $i ][ $j ] == 1)
$row_flag = true;
if ( $j == 0 &
&
$mat [ $i ][ $j ] == 1)
$col_flag = true;
if ( $mat [ $i ][ $j ] == 1)
{
$mat [0][ $j ] = 1;
$mat [ $i ][0] = 1;
}
}
}// Modify the input matrix
// mat[] using the first
// row and first column of
// Matrix mat
for ( $i = 1;
$i <
$R ;
$i ++)
{
for ( $j = 1;
$j <
$C ;
$j ++)
{
if ( $mat [0][ $j ] == 1 ||
$mat [ $i ][0] == 1)
{
$mat [ $i ][ $j ] = 1;
}
}
}// modify first row
// if there was any 1
if ( $row_flag == true)
{
for ( $i = 0;
$i <
$C ;
$i ++)
{
$mat [0][ $i ] = 1;
}
}// modify first col
// if there was any 1
if ( $col_flag == true)
{
for ( $i = 0;
$i <
$R ;
$i ++)
{
$mat [ $i ][0] = 1;
}
}
}/* A utility function
to print a 2D matrix */
function printMatrix(&
$mat )
{
global $R , $C ;
for ( $i = 0;
$i <
$R ;
$i ++)
{
for ( $j = 0;
$j <
$C ;
$j ++)
{
echo $mat [ $i ][ $j ]. " " ;
}
echo "\n" ;
}
}// Driver Code
$mat = array ( array (1, 0, 0, 1 ), array (0, 0, 1, 0 ), array (0, 0, 0, 0 ));
echo "Input Matrix :\n" ;
printMatrix( $mat );
modifyMatrix( $mat );
echo "Matrix After Modification :\n" ;
printMatrix( $mat );
// This code is conrtributed
// by ChitraNayal
?>
输出如下:
Input Matrix :100100100000Matrix After Modification :111111111011
推荐阅读
- A缓冲法详细指南(图解)
- 算法设计(如何解决布尔数组难题())
- C++标准模板库(STL)介绍和指南
- JavaScript按位运算符用法指南
- 功能与非功能需求详细介绍
- 在不使用GCD的情况下查找两个以上(或数组)数字的LCM
- C中的输入输出系统调用创建,打开,关闭,读取,写入
- DNS欺骗或DNS缓存中毒简要介绍
- U盘识别不了,本文教您U盘识别不了怎样修好