void zero(int a[][4],int m,int n){
bool row[m], col[n];
memset(row,false,sizeof(row));
memset(col,false,sizeof(col));
for(int i = 0;i<m;i++)
{
for(int j= 0;j<n ; j++ )
{
if(a[i][j]==0){
row[i]=true;
col[j]=true;
}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(row[i] || row[j])
a[i][j]=0;
}
}
}
int main(){
int a[][4]={
{1,2,3,4},
{1,2,4,5},
{4,0,6,7},
{3,6,3,56},
}
zero(a,4,4);
for(int i = 0 ; i<4;i++){
for(int j = 0;j < 4 ; j++){
cout << a[i][j]<<" " ;
}cout <<endl;
}
}
编写一种算法,使得如果MxN矩阵中的元素为0,则将其整个行和列设置为0。 所以这是我的代码。你可以看到a [2] [1] = 0,所以第2行和第1列应该是0.但我的结果是第2行,第2列是0。真的很困惑......请帮忙
答案 0 :(得分:2)
如果您在遍历过程中在行或列中发现0时立即开始用0替换行和列,那么最终整个数组将变为零。
正确的解决方案是在遍历数组时将索引对存储(行,列),然后在遍历完成后使用这些对逐个更改数组。
array = [
[1 , 2, 3],
[4 , 5, 0],
[7 , 8, 9]
]
indices_pairs = [(row,col) for row in range(len(array)) for col in range(len(array[0])) if array[row][col] == 0]
for indices_pair in indices_pairs:
row, col = indices_pair
for i in range(len(array[0])):
array[row][i] = 0
for i in range(len(array)):
array[i][col] = 0
print(array)
[
[1 , 2, 0],
[0 , 0, 0],
[7 , 8, 0]
]
答案 1 :(得分:0)
这是一个简单的解决方案:
public static void setZeros(int[][] matrix) {
int[] row = new int[matrix.length];
int[] column = new int[matrix[0].length];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] == 0) {
row[i] = 1;
column[j] = 1;
}
}
}
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if ((row[i] == 1 || column[j] == 1)) {
matrix[i][j] = 0;
}
}
}
}
答案 2 :(得分:-1)
你调用一个函数来验证你的元素是否为零,如果它们被替换为“true”,那么在这个函数中你测试是否存在这些元素,如果它们确实存在,则将它们设置为零,当然一切都会是零;)