LintCode-矩阵归零

给定一个m×n矩阵,如果一个元素是0,则将其所在行和列全部元素变成0。

需要在原地完成。

样例

给出一个矩阵[[1,2],[0,3]],返回[[0,2],[0,0]]

挑战

你是否使用了额外的空间?

一个直接的解决方案是使用O(MN)的额外空间,但这并不是一个好的方案。

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

你能想出一个常数空间的解决方案吗?

分析:若点(i,j)为0,则可以把(i,0),(0,j)标记为0,最后根据该标记把列和行设置为0,这样的设置会影响第一行和第一列,所以第一行和第一列需要提前判断好。

代码:

class Solution {
public:
    /**
     * @param matrix: A list of lists of integers
     * @return: Void
     */
    void setZeroes(vector<vector<int> > &matrix) {
        // write your code here
        int n = matrix.size();
        if(n==0)
            return ;
        int m = matrix[0].size();
        bool firstLine = false;
        bool firstColumn = false;
        for(int i=0;i<n;i++)
            if(matrix[i][0]==0)
                firstColumn=true;
        for(int i=0;i<m;i++)
            if(matrix[0][i]==0)
                firstLine = true;
        for(int i=1;i<n;i++)
        {
            for(int j=1;j<m;j++)
            {
                if(matrix[i][j]==0)
                {
                    matrix[i][0]=0;
                    matrix[0][j]=0;
                }
            }
        }
        for(int i=1;i<n;i++)
        {
            if(matrix[i][0]==0)
            {
                for(int j=0;j<m;j++)
                    matrix[i][j]=0;
            }
        }
        for(int i=1;i<m;i++)
        {
            if(matrix[0][i]==0)
            {
                for(int j=0;j<n;j++)
                    matrix[j][i]=0;
            }
        }
        if(firstLine)
            for(int i=0;i<m;i++)
                matrix[0][i]=0;
        if(firstColumn)
            for(int i=0;i<n;i++)
                matrix[i][0]=0;
    }
};
时间: 2024-11-08 22:15:37

LintCode-矩阵归零的相关文章

矩阵归零

代码: class Solution { public: /** * @param matrix: A list of lists of integers * @return: Void */ void setZeroes(vector<vector<int> > &matrix) { // write your code here int n = matrix.size(); if(n==0) return ; int m = matrix[0].size(); bool

noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T1——T10

T01 矩阵交换行 描述 给定一个5*5的矩阵(数学上,一个r×c的矩阵是一个由r行c列元素排列成的矩形阵列),将第n行和第m行交换,输出交换后的结果. 输入 输入共6行,前5行为矩阵的每一行元素,元素与元素之间以一个空格分开.第6行包含两个整数m.n,以一个空格分开.(1 <= m,n <= 5) 输出 输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开. 样例输入 1 2 2 1 2 5 6 7 8 3 9 3 0 5 3 7 2 1 4 6 3 0 8 2 4 1 5 样

整理小朋友在noi.openjudge上的作业(1)

NOI(题库正在建设中,做题纪录有可能会被删除,请注意) 第一章的统计放前面 1 编程基础之输入输出 10 0 0% 最基础有空补刷 2 编程基础之变量定义.赋值及转换 10 0 0% 最基础有空补刷 3 编程基础之算术表达式与顺序执行 20 0 0% 最基础有空补刷 4 编程基础之逻辑表达式与条件分支 21 0 0% 最基础有空补刷 5 编程基础之循环控制 45 10 22% 最基础有空补刷 6 编程基础之一维数组 15 5 33% 最基础有空补刷 7 编程基础之字符串 35 0 0% 有必要

【北大先修课】计算概论(A)题库全代码

题目很水就是全都是坑真是丧心病狂啊 把代码留下造福后来人QωQ 结构体与链表练习 生日相同2.0 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define MAXN 200 using namespace std; struct st { int m,d; string name; bool operator&

学习笔记CB012: LSTM 简单实现、完整实现、torch、小说训练word2vec lstm机器人

真正掌握一种算法,最实际的方法,完全手写出来. LSTM(Long Short Tem Memory)特殊递归神经网络,神经元保存历史记忆,解决自然语言处理统计方法只能考虑最近n个词语而忽略更久前词语的问题.用途:word representation(embedding)(词语向量).sequence to sequence learning(输入句子预测句子).机器翻译.语音识别等. 100多行原始python代码实现基于LSTM二进制加法器.https://iamtrask.github.

lintcode 容易题:Search a 2D Matrix 搜索二维矩阵

题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] 给出 target = 3,返回 true 挑战 O(log(n) + log(m)) 时间复杂度 解题: 1.最简单的方法就是遍历整个矩阵,时间复杂度:O(log(mn)),这个应该等于O(long(

lintcode 中等题:search a 2d matrix II 搜索二维矩阵II

题目 搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没有重复的整数. 样例 考虑下列矩阵: [     [1, 3, 5, 7],     [2, 4, 7, 8],     [3, 5, 9, 10] ] 给出target = 3,返回 2 挑战 要求O(m+n) 时间复杂度和O(1) 额外空间 解题 直接遍历,时间复杂度是O(MN) public

lintcode 容易题:Matrix Zigzag Traversal 矩阵的之字型遍历

题目: 矩阵的之字型遍历 给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历. 样例 对于如下矩阵: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10, 11, 12] ] 返回 [1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12] 解题: 感觉很简单,就是没有搞出来,程序来源 ,这里是先右上走,我换成先横着走就是不对了,表示不理解.另外一种方法,表示也不理解. java程序: public class Solut

lintcode 搜索二维矩阵

题目:搜索二维矩阵 描述: 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] 给出 target = 3,返回 true ------------------------------------------- 开始用两个二分搜索,先找列,再找行.运行后提示超时... 1 c

LintCode 28. 搜索二维矩阵

题目: 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] 给出 target = 3,返回 true 挑战 O(log(n) + log(m)) 时间复杂度 解:可将其看成一个一维有序的数组,用二分查找. 这个一维数组从下标0开始,最后一个元素的下标为m*n-1; 一维数组