CareerCup之1.7 Set Matrix Zeroes

【题目】

原文:

1.7 Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0.

译文:

写一个函数处理一个MxN的矩阵,如果矩阵中某个元素为0,那么把它所在的行和列都置为0.

【分析】

【思路一】

遍历一次矩阵,当遇到元素等于0时,记录下这个元素对应的行和列。 可以开一个行数组row和列数组col,当元素a[i][j]等于0时, 就把row[i]和col[j]置为true。第二次遍历矩阵时,当某个元素对应的行row[i] 或列col[j]被设置为true,说明该元素在需要被置0的行或列上,因此将它置0。

【思路二】

想要常数空间,可以复用第一行和第一列作为辅助空间使用。不用开辟新的存储空间。其实第一行和第一列所在数组就是思路1中设置的数组,这样减少空间开销。

1.先确定第一行和第一列是否需要清零即,看看第一行中是否有0,记下来。也同时记下来第一列中有没有0。

2.扫描剩下的矩阵元素,如果遇到了0,就将该行第一个元素和该列第一个元素赋值为0即赋值第一行数组和第一列数组。

这里不用担心会将本来第一行或第一列的1改成了0,因为这些值最后注定要成为0的。

3.根据第一行和第一列的信息,已经可以将剩下的矩阵元素赋值为结果所需的值了即,拿第一行为例,如果扫描到一个0,就将这一列都清0。

4.根据1中确定的状态,处理第一行和第一列。如果最开始得到的第一行中有0的话,就整行清零。同理对列进行处理。

【代码一】

/*********************************
*   日期:2014-05-15
*   作者:SJF0115
*   题目:  Set Matrix Zeroes
*   来源:CareerCup
**********************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;

void  SetMatrixZeroes(int **matrix,int m,int n){
    int i,j;
    //初始化
    int* col = new int(n+1);
    int* row = new int(m+1);
    memset(col,0,sizeof(int)*(n+1));
    memset(row,0,sizeof(int)*(m+1));
    //寻找0
    for(i = 0;i < m;i++){
        for(j = 0;j < n;j++){
            if(matrix[i][j] == 0){
                row[i] = col[j] = 1;
            }//if
        }//for
    }//for
    //0所在列和行全置为0
    for(i = 0;i < m;i++){
        for(j = 0;j < n;j++){
            if(row[i] || col[j]){
                matrix[i][j] = 0;
            }//if
        }//for
    }//for
}

int main(){
    int m,n,i,j;
    //freopen("C:\\Users\\XIAOSI\\Desktop\\acm.txt","r",stdin);
    while(scanf("%d%d",&m,&n) != EOF){
        if(m == 0 || n == 0){
            break;
        }
        //初始化
        int** matrix = new int*[m];
        for(i = 0;i < m;i++){
            matrix[i] = new int[n];
        }
        //输入
        for(i = 0;i < m;i++){
            for(j = 0;j < n;j++){
                cin>>matrix[i][j];
            }
        }
        //置0
        SetMatrixZeroes(matrix,m,n);
        //输出
        for(i = 0;i < m;i++){
            for(j = 0;j < n;j++){
                cout<<matrix[i][j]<<" ";
            }
            cout<<endl;
        }
    }
    return 0;
}

【代码二】

/*********************************
*   日期:2014-05-15
*   作者:SJF0115
*   题目: Set Matrix Zeroes
*   来源:CareerCup
**********************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
//Set Matrix Zeroes
void  SetMatrixZeroes(int **matrix,int m,int n){
    int i,j;
    int firstRow = 0;
    int firstCol = 0;
    //判断第一行是否有0
    for(i = 0;i < n;i++){
        if(matrix[0][i] == 0){
            firstRow = 1;
        }
    }//for
    //判断第一列是否有0
    for(i = 0;i < m;i++){
        if(matrix[i][0] == 0){
            firstCol = 1;
        }
    }//for
    //搜索0进行标记
    for(i = 0;i < m;i++){
        for(j = 0;j < n;j++){
            if(matrix[i][j] == 0){
                matrix[i][0] = 0;
                matrix[0][j] = 0;
            }//if
        }//for
    }//for
    //根据第一行和第一列把剩余元素进行置零
    for(i = 1;i < m;i++){
        for(j = 1;j < n;j++){
            if(matrix[i][0] == 0 || matrix[0][j] == 0){
                matrix[i][j] = 0;
            }//if
        }//for
    }//for
    //第一行存有0则全设置为0
    if(firstRow){
        for(i = 0;i < n;i++){
            matrix[0][i] = 0;
        }
    }//if
    //第一列存有0则全设置为0
    if(firstCol){
        for(i = 0;i < m;i++){
            matrix[i][0] = 0;
        }
    }//if
}

int main(){
    int m,n,i,j;
    freopen("C:\\Users\\XIAOSI\\Desktop\\acm.txt","r",stdin);
    while(scanf("%d%d",&m,&n) != EOF){
        if(m == 0 || n == 0){
            break;
        }
        //初始化
        int** matrix = new int*[m];
        for(i = 0;i < m;i++){
            matrix[i] = new int[n];
        }
        //输入
        for(i = 0;i < m;i++){
            for(j = 0;j < n;j++){
                cin>>matrix[i][j];
            }
        }
        //置0
        SetMatrixZeroes(matrix,m,n);
        //输出
        for(i = 0;i < m;i++){
            for(j = 0;j < n;j++){
                cout<<matrix[i][j]<<" ";
            }
            cout<<endl;
        }
    }
    return 0;
}

CareerCup之1.7 Set Matrix Zeroes

时间: 2024-10-11 07:43:15

CareerCup之1.7 Set Matrix Zeroes的相关文章

[CareerCup] 1.7 Set Matrix Zeroes 矩阵赋零

1.7 Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column are set to 0. LeetCode中的原题,请参见我之前的博客Set Matrix Zeroes 矩阵赋零.

LeetCode 第 73 题 (Set Matrix Zeroes)

LeetCode 第 73 题 (Set Matrix Zeroes) Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. Follow up: Did you use extra space? A straight forward solution using O(mn) space is probably a bad idea. A simple impro

Set Matrix Zeroes

73 Set Matrix Zeroes 原文链接:http://blog.csdn.net/doc_sgl/article/details/11834933 Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. Follow up: Did you use extra space?A straight forward solution using O(mn) s

【leetcode刷题笔记】Set Matrix Zeroes

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 题解:因为题目要求原地算法,所以我们只能利用矩阵第一行和第一列存放置零信息. 首先遍历第一行和第一列,看他们是否需要全部置零,用两个变量first_column_zero和first_row_zero来记录: 遍历矩阵,如果某个位置matrix[i][j]出现了0,就把matrix[i][0]和Matrix[0

LeetCode:Set Matrix Zeroes - 将矩阵内含有零的行和列全部置零

1.题目名称 Set Matrix Zeroes(将矩阵内含有零的行和列全部置零) 2.题目地址 https://leetcode.com/problems/set-matrix-zeroes/ 3.题目内容 英文:Given a m x n matrix, if an element is 0, set its entire row and column to 0. 中文:给定一个m×n的矩阵,如果其中一个元素是0,则将该元素所在的整行或整理全部置为0 4.解题方法1 使用第一行和第一列记录某

Leetcode 细节实现 Set Matrix Zeroes

Set Matrix Zeroes Total Accepted: 18139 Total Submissions: 58671My Submissions Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. click to show follow up. 题意:给定矩阵,如果矩阵的某个位置为0,则把那一行那一列的所有元素都置为0 思路:用两个bool数组,分

Set Matrix Zeroes leetcode java

题目: Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. click to show follow up. Follow up: Did you use extra space? A straight forward solution using O(mn) space is probably a bad idea. A simple improvement

073 Set Matrix Zeroes

073 Set Matrix Zeroes 这道题唯一有点tricky的地方就是 需要O(1) 的space, 这样就利用第一个行 和第一列作为整个matrix的标记位,再用 row 和 col两个作为第一列和第一个行的标志位 class Solution: # @param {integer[][]} matrix # @return {void} Do not return anything, modify matrix in-place instead. def setZeroes(sel

【LeetCode-面试算法经典-Java实现】【070-Set Matrix Zeroes(矩阵置零)】

[070-Set Matrix Zeroes(矩阵置零)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 题目大意 给定一个m*n的矩阵,如果某个位置是0.将对应的行和列设置为0. 解题思路 先对矩阵进行扫描,标记要进行置0的行和列,对要进行置0的行在第0列上进行标记,对置0的列在