博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Set Matrix Zeroes 矩阵赋零
阅读量:7062 次
发布时间:2019-06-28

本文共 1863 字,大约阅读时间需要 6 分钟。

 

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?

 

据说这题是CareerCup上的原题,我还没有刷CareerCup,所以不知道啦,不过这题也不算难,虽然我也是看了网上的解法照着写的,但是下次遇到绝对想的起来。这道题中说的空间复杂度为O(mn)的解法自不用多说,直接新建一个和matrix等大小的矩阵,然后一行一行的扫,只要有0,就将新建的矩阵的对应行全赋0,行扫完再扫列,然后把更新完的矩阵赋给matrix即可,这个算法的空间复杂度太高。将其优化到O(m+n)的方法是,用一个长度为m的一维数组记录各行中是否有0,用一个长度为n的一维数组记录各列中是否有0,最后直接更新matrix数组即可。这道题的要求是用O(1)的空间,那么我们就不能新建数组,我们考虑就用原数组的第一行第一列来记录各行各列是否有0.

- 先扫描第一行第一列,如果有0,则将各自的flag设置为true

- 然后扫描除去第一行第一列的整个数组,如果有0,则将对应的第一行和第一列的数字赋0
- 再次遍历除去第一行第一列的整个数组,如果对应的第一行和第一列的数字有一个为0,则将当前值赋0
- 最后根据第一行第一列的flag来更新第一行第一列

代码如下:

 

class Solution {public:    void setZeroes(vector
> &matrix) { if (matrix.empty() || matrix[0].empty()) return; int m = matrix.size(), n = matrix[0].size(); bool rowZero = false, colZero = false; for (int i = 0; i < m; ++i) { if (matrix[i][0] == 0) colZero = true; } for (int i = 0; i < n; ++i) { if (matrix[0][i] == 0) rowZero = true; } for (int i = 1; i < m; ++i) { for (int j = 1; j < n; ++j) { if (matrix[i][j] == 0) { matrix[0][j] = 0; matrix[i][0] = 0; } } } for (int i = 1; i < m; ++i) { for (int j = 1; j < n; ++j) { if (matrix[0][j] == 0 || matrix[i][0] == 0) { matrix[i][j] = 0; } } } if (rowZero) { for (int i = 0; i < n; ++i) matrix[0][i] = 0; } if (colZero) { for (int i = 0; i < m; ++i) matrix[i][0] = 0; } }};

 

转载地址:http://lfnll.baihongyu.com/

你可能感兴趣的文章
使用必应查询接口开发搜索工具:反查一个IP上的旁站
查看>>
RHCE 学习笔记(7) 进程管理
查看>>
Lync Server 2010迁移至Lync Server 2013故障排错 Part 2: Lync Server 迁移后部分用户无法移池问题...
查看>>
Hyper-V 2节点集群高可用的限制
查看>>
Silverlight Navigation导航框架实例系列汇总
查看>>
走近复杂数据库计算型软件的设计与制作(3)—视图的设计
查看>>
域用户权限|运行软件
查看>>
如何解决双显示器显示B/S架构软件的问题
查看>>
Android笔记:Wake Lock
查看>>
简单易用的headless浏览器
查看>>
编写shell脚本的另一种方法
查看>>
产品设计体会(2012)另一种产品版本细分策略
查看>>
企业WIFI安全应用方案
查看>>
修改eclipse自动生成的comments中的author名字
查看>>
路由基础概念解析
查看>>
oracle 中删除表 drop delete truncate 的区别
查看>>
轻巧的网络流量实时监控工具NTOPNG
查看>>
Exchange 2013部署系列之(八)邮箱、通讯组创建及规划
查看>>
贪心初步-A - Doing Homework again
查看>>
[CTO札记]盛大文学公司名称对联
查看>>