题目
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例及提示
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码1(C语言)
#include<stdio.h>
#include<malloc.h>
void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
int **b = (int **)malloc(matrixSize * sizeof(int *));
// 为每行分配5列
for(int i = 0; i < matrixSize; i++)
{
b[i] = (int *)malloc(* matrixColSize * sizeof(int));
}
for(int i=0;i<matrixSize;i++){
for(int j=0;j<* matrixColSize;j++){
b[i][j]=matrix[i][j];
}
}
for(int i=0;i<matrixSize;i++){
for(int j=0;j<*matrixColSize;j++){
if(b[i][j]==0){
for(int x=0;x<matrixSize;x++){
matrix[x][j]=0;
}
for(int y=0;y<* matrixColSize;y++){
matrix[i][y]=0;
}
}
}
}
}
#include <stdlib.h>
int main()
{
int nums[][3]={{1,1,1},{1,0,1},{1,1,1}};
int m=sizeof(nums)/sizeof(nums[0]);
int n=3;
// 为二维数组分配n行
int **a = (int **)malloc(m * sizeof(int *));
// 为每行分配5列
for(int i = 0; i < m; i++)
{
a[i] = (int *)malloc(n * sizeof(int));
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
a[i][j]=nums[i][j];
}
}
int gridColSize=n;
setZeroes(a,m,&gridColSize);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
方案1,建立一个新的矩阵m*n存储原矩阵各个元素的情况,根据这个矩阵的0元素的情况对原矩阵进行行列处理。
代码2(C语言)
//guoxue_20210202
#include<stdio.h>
#include<malloc.h>
void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
int *x=(int*)malloc(matrixSize*sizeof(int));
int *y=(int*)malloc(* matrixColSize*sizeof(int));
for(int i = 0; i < matrixSize; i++){
x[i] = 0;
}
for(int i = 0; i < * matrixColSize; i++){
y[i] = 0;
}
for(int i=0;i<matrixSize;i++){
for(int j=0;j<*matrixColSize;j++){
if(matrix[i][j]==0){
x[i]++;
y[j]++;
}
}
}
for(int i=0;i<matrixSize;i++){
if(x[i]!=0){
for(int j=0;j<*matrixColSize;j++){
matrix[i][j]=0;
}
}
}
for(int j=0;j<* matrixColSize;j++){
if(y[j]!=0){
for(int i=0;i<*matrixColSize;i++){
matrix[i][j]=0;
}
}
}
}
int main()
{
int nums[][3]={{1,1,1},{1,0,1},{1,1,1}};
int m=sizeof(nums)/sizeof(nums[0]);
int n=3;
// 为二维数组分配n行
int **a = (int **)malloc(m * sizeof(int *));
// 为每行分配5列
for(int i = 0; i < m; i++)
{
a[i] = (int *)malloc(n * sizeof(int));
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
a[i][j]=nums[i][j];
}
}
int gridColSize=n;
setZeroes(a,m,&gridColSize);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
将方案1中的m*n的矩阵简化为两个大小分别为m和n的矩阵。
解读
哈希表的应用