[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 improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?

【题意】

给定一个mxn的矩阵,如果一个元素是0,则它的整个行和列都设置为0。在原矩阵上进行操作。

你有没有使用额外的空间? 

直接使用为O(MN)的空间的方案可能并不是一个好的主意。 

一个简单的改进方案需要O(M + N)的空间,但仍然不是最好的解决方案。 

你可以制定一个连续的空间解决方案?

【分析】

  • 思路1:

O(m + n) 空间的方法很简单,设置两个数组,记录每行和每列是否存在 0。

  • 思路2:

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

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

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

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

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

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

【代码1】

/*********************************
*   日期:2014-01-23
*   作者:SJF0115
*   题号: Set Matrix Zeroes
*   来源:http://oj.leetcode.com/problems/set-matrix-zeroes/
*   结果:AC
*   来源:LeetCode
*   总结:
**********************************/
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;

class Solution {
public:
    //时间复杂度 O(m*n),空间复杂度 O(m+n)
    void setZeroes(vector<vector<int> > &matrix) {
        int i,j;
        int m = matrix.size();
        int n = matrix[0].size();
        //标记该行是否存在0
        vector<int> row(m,false);
        //标记该列是否存在0
        vector<int> col(n,false);
        //搜索0标记行列
        for(i = 0;i < m;i++){
            for(j = 0;j < n;j++){
                if(matrix[i][j] == 0){
                    col[j] = row[i] = true;
                }//if
            }//for
        }//for
        //如果某行存在0设置改行全为0
        for(i = 0;i < m;i++){
            if(row[i]){
                //设置为0
                for(j = 0;j < n;j++){
                    matrix[i][j] = 0;
                }//for
            }//if
        }//for
        //如果某列存在0设置改列全为0
        for(i = 0;i < n;i++){
            if(col[i]){
                //设置为0
                for(j = 0;j < m;j++){
                    matrix[j][i] = 0;
                }//for
            }//if
        }//for
    }
};
int main() {
    Solution solution;
    vector<int> row1 = {1,0,3,4};
    vector<int> row2 = {9,4,0,2};
    vector<int> row3 = {6,7,3,4};
    vector<vector<int>> matrix;
    matrix.push_back(row1);
    matrix.push_back(row2);
    matrix.push_back(row3);

    solution.setZeroes(matrix);
    int m = matrix.size();
    int n = matrix[0].size();
    for(int i = 0;i < m;i++){
        for(int j = 0;j < n;j++){
            printf("%d ",matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}

【代码2】

/*********************************
*   日期:2014-01-23
*   作者:SJF0115
*   题号: Set Matrix Zeroes
*   来源:http://oj.leetcode.com/problems/set-matrix-zeroes/
*   结果:AC
*   来源:LeetCode
*   总结:
**********************************/
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;

class Solution {
public:
    //时间复杂度 O(m*n),空间复杂度 O(1)
    void setZeroes(vector<vector<int> > &matrix) {
        //标记第一行是否有0
        bool rowZero = false;
        //标记第一列是否有0
        bool colZero = false;
        int i,j;
        int m = matrix.size();
        int n = matrix[0].size();
        //判断第一行是否有0
        for(i = 0;i < n;i++){
            if(matrix[0][i] == 0){
                rowZero = true;
            }//if
        }//for
        //判断第一列是否有0
        for(i = 0;i < m;i++){
            if(matrix[i][0] == 0){
                colZero = true;
            }//if
        }//for
        //搜索0进行标记
        for(i = 1;i < m;i++){
            for(j = 1;j < n;j++){
                if(matrix[i][j] == 0){
                    matrix[i][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(rowZero){
            for(i = 0;i < n;i++){
                matrix[0][i] = 0;
            }
        }//if
        //第一列存有0则全设置为0
        if(colZero){
            for(i = 0;i < m;i++){
                matrix[i][0] = 0;
            }
        }//if
    }
};
int main() {
    Solution solution;
    vector<int> row1 = {1,2,3,4};
    vector<int> row2 = {9,4,0,2};
    vector<int> row3 = {6,7,3,4};
    vector<vector<int>> matrix;
    matrix.push_back(row1);
    matrix.push_back(row2);
    matrix.push_back(row3);

    solution.setZeroes(matrix);
    int m = matrix.size();
    int n = matrix[0].size();
    for(int i = 0;i < m;i++){
        for(int j = 0;j < n;j++){
            printf("%d ",matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}
时间: 2024-11-10 12:07:36

[LeetCode]73.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 is set to 0. 译文: 写一个函数处理一个MxN的矩阵,如果矩阵中某个元素为0,那么把它所在的行和列都置为0. [分析] [思路一] 遍历一次矩阵,当遇到元素等于0时,记录下这个元素对应的行和列. 可以开一个行数组row和列数组col,当元素a[i][j]等于0时, 就把row[

[LeetCode]172.Factorial Trailing Zeroes

题目 Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. 分析 朴素解法: 首先求出n!,然后计算末尾0的个数.(重复÷10,直到余数非0) 该解法在输入的数字稍大时就会导致阶乘得数溢出,不足取. O(logn)解法: 考虑n!的质数因子. 后缀0总是由质因子2和质因子5相乘得来的.如果我们可以计数

[LeetCode]59.Spiral Matrix II

[题目] Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example, Given n = 3, You should return the following matrix: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] [分析] 模拟 [代码] /**-------------------------

[LeetCode]--54. Spiral Matrix

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. For example, Given the following matrix: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] You should return [1,2,3,6,9,8,7,4,5]. 我想着把这个二维数组分成一层一层的环,然后一层

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. 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 uses O

leetcode难度及面试频率

转载自:LeetCode Question Difficulty Distribution               1 Two Sum 2 5 array sort         set Two Pointers 2 Add Two Numbers 3 4 linked list Two Pointers           Math 3 Longest Substring Without Repeating Characters 3 2 string Two Pointers      

LeetCode All in One 题目讲解汇总(持续更新中...)

终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博主啊,多谢多谢,祝大家刷得愉快,刷得精彩,刷出美好未来- 博主制作了一款iOS的应用"Leetcode Meet Me",里面有Leetcode上所有的题目,并且贴上了博主的解法,随时随地都能

LeetCode总结【转】

转自:http://blog.csdn.net/lanxu_yy/article/details/17848219 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近完成了www.leetcode.com的online judge中151道算法题目.除各个题目有特殊巧妙的解法以外,大部分题目都是经典的算法或者数据结构,因此做了如下小结,具体的解题思路可以搜索我的博客:LeetCode题解 题目 算法 数据结构 注意事项 Clone Graph BFS 哈希表 Word Ladder II

CareerCup之2.1无序链表删除重复元素

[题目] 原文: 2.1 Write code to remove duplicates from an unsorted linked list. FOLLOW UP How would you solve this problem if a temporary buffer is not allowed? 译文: 从一个未排序的链表中移除重复的项 进一步地, 如果不允许使用临时的缓存,你如何解决这个问题? [分析] (1)如果可以使用额外的存储空间,我们就开一个数组来保存一个元素的出现情况.