LeetCode: Set Matrix Zeroes 解题报告
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(m + n) space, but still not the best solution.
Could you devise a constant space solution?

SOLUTION 1:
题目要求O(1)的空间消耗。
1. 我们可以使用第一行,第一列来作为Flag,记录某一行,某一列是否应该被设置为0.
2. 因为第一行,第一列共用左上角的flag,所以我们需要另外找2个flag来定义第一行,第一列本身是否应该设置为0.
row1Zero, col1Zero
3. 先扫描首行,首列把首行首列的flag算出。
4. 扫描其他的矩阵,将第一行每一列的flag算出。
5. 设置矩阵中除了首行首列的cells.
6. 设置首行,设置首列。
public class Solution {
public void setZeroes(int[][] matrix) {
if (matrix == null || matrix.length ==
|| matrix[].length == ) {
return;
}
boolean row1Zero = false;
boolean col1Zero = false;
int rows = matrix.length;
int cols = matrix[].length;
// Determine if the first column should be Zero.
for (int i = ; i < rows; i++) {
if (matrix[i][] == ) {
col1Zero = true;
break;
}
}
// Determine if the first row should be Zero.
for (int i = ; i < cols; i++) {
if (matrix[][i] == ) {
row1Zero = true;
break;
}
}
// we use the first row and the first col as the flag to record the
// cells whether or not set to 0.
for (int i = ; i < rows; i++) {
for (int j = ; j < cols; j++) {
// 注意了,这个矩阵是0和非0,并不是0和1.
if (matrix[i][j] == ) {
// set the flag in the first line and the first column
matrix[i][] = ;
matrix[][j] = ;
}
}
}
// set the inner cells.
// Be careful: i, j start from 1.
for (int i = ; i < rows; i++) {
for (int j = ; j < cols; j++) {
if (matrix[i][] ==
|| matrix[][j] == ) {
matrix[i][j] = ;
}
}
}
// set the first row.
if (row1Zero) {
for (int i = ; i < cols; i++) {
matrix[][i] = ;
}
}
// set the first col.
if (col1Zero) {
for (int i = ; i < rows; i++) {
matrix[i][] = ;
}
}
return;
}
}
2014.1230 redo:
把前面三个循环合并,会简单一点儿。
public class Solution {
public void setZeroes(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return;
}
boolean row1 = false;
boolean col1 = false;
int rows = matrix.length;
int cols = matrix[0].length;
// set flags.
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (matrix[i][j] != 0) {
continue;
}
// set the flag of a column and a row.
matrix[0][j] = 0;
matrix[i][0] = 0;
// get flag of first row.
if (i == 0) {
row1 = true;
}
// get flag of first column.
if (j == 0) {
col1 = true;
}
}
}
// set the matrix.
for (int i = 1; i < rows; i++) {
for (int j = 1; j < cols; j++) {
if (matrix[0][j] == 0 || matrix[i][0] == 0) {
matrix[i][j] = 0;
}
}
}
// set first column
if (col1) {
for (int i = 0; i < rows; i++) {
// bug 1: can't use matrix[i][j]
matrix[i][0] = 0;
}
}
// set first row.
if (row1) {
for (int i = 0; i < cols; i++) {
matrix[0][i] = 0;
}
}
}
}
GitHub Code:
LeetCode: Set Matrix Zeroes 解题报告的更多相关文章
- LeetCode: Spiral Matrix II 解题报告-三种方法解决旋转矩阵问题
Spiral Matrix IIGiven an integer n, generate a square matrix filled with elements from 1 to n2 in sp ...
- 【LeetCode】73. Set Matrix Zeroes 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 原地操作 新建数组 队列 日期 题目地址:https ...
- 【LeetCode】Set Matrix Zeroes 解题报告
今天看到CSDN博客的勋章换了图表,同一时候也添加显示了博客等级,看起来都听清新的,感觉不错! [题目] Given a m x n matrix, if an element is 0, set i ...
- LeetCode 283 Move Zeroes 解题报告
题目要求 Given an array nums, write a function to move all 0's to the end of it while maintaining the re ...
- 【LeetCode】474. Ones and Zeroes 解题报告(Python)
[LeetCode]474. Ones and Zeroes 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ ...
- LeetCode 1 Two Sum 解题报告
LeetCode 1 Two Sum 解题报告 偶然间听见leetcode这个平台,这里面题量也不是很多200多题,打算平时有空在研究生期间就刷完,跟跟多的练习算法的人进行交流思想,一定的ACM算法积 ...
- 【LeetCode】Permutations II 解题报告
[题目] Given a collection of numbers that might contain duplicates, return all possible unique permuta ...
- 【LeetCode】Island Perimeter 解题报告
[LeetCode]Island Perimeter 解题报告 [LeetCode] https://leetcode.com/problems/island-perimeter/ Total Acc ...
- 【LeetCode】Largest Number 解题报告
[LeetCode]Largest Number 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/largest-number/# ...
随机推荐
- 【Docker】常用命令
1.查看正在运行的容器 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND ...
- 科学计算法帮助类MathUtils
import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; /** * 科学计算 ...
- 细说HTML元素的隐藏和显示
CSS文档对HTML的显示和隐藏有2个属性可供选择: 1.display 2.visiblity 这2个有什么区别呢? display: display版本:CSS1/CSS2 兼容性:IE4+ NS ...
- document.ready、window.onload、body.onload的区别
document的ready事件通常会比window的onload事件先发生,为什么呢? 因为document的ready是在浏览器加载解析并构建完doc文档模型时发生的,而window的onload ...
- 关于vsftpd的refusing to run with writable root inside chroot()问题
今天在上班帮测试的同事搭建ftp服务器时出现的一个问题 服务搭建完成后连接时报这个错误: refusing to run with writable root inside chroot() 查了资料 ...
- 有用的git片段
世界上知识那么多,又岂是人力所能穷尽,于是术业有专攻.对于git,有用的命令片段其实非常少,而命令却是非常多.于是,掌握git常见的用法就足够了.不要在语句级别上记忆git命令,在代码片段级别上记忆g ...
- python学习笔记——信号模块signal
基于python学习笔记——多进程间通信——Linux信号基础的学习基础,进一步学习Python标准库中的signal模块. 尽管signal是python中的模块,但是主要针对UNIX平台(比如Li ...
- Java实现文件自动打包成zip并下载的代码
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java. ...
- Linux内核(11) - 子系统的初始化之内核选项解析
首先感谢国家.其次感谢上大的钟莉颖,让我知道了大学不仅有校花,还有校鸡,而且很多时候这两者其实没什么差别.最后感谢清华女刘静,让我深刻体会到了素质教育的重要性,让我感到有责任写写子系统的初始化. 各个 ...
- Go 普通LOG输出
因为Go 语言中没有自带的宏, 来表示行号和文件, 需要从方法中去获取,麻烦.所以封装了一个函数,用于输出平时程序的打印日志 import ( "fmt" "log&qu ...