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:

SetZeroes.java

LeetCode: Set Matrix Zeroes 解题报告的更多相关文章

  1. LeetCode: Spiral Matrix II 解题报告-三种方法解决旋转矩阵问题

    Spiral Matrix IIGiven an integer n, generate a square matrix filled with elements from 1 to n2 in sp ...

  2. 【LeetCode】73. Set Matrix Zeroes 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 原地操作 新建数组 队列 日期 题目地址:https ...

  3. 【LeetCode】Set Matrix Zeroes 解题报告

    今天看到CSDN博客的勋章换了图表,同一时候也添加显示了博客等级,看起来都听清新的,感觉不错! [题目] Given a m x n matrix, if an element is 0, set i ...

  4. 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 ...

  5. 【LeetCode】474. Ones and Zeroes 解题报告(Python)

    [LeetCode]474. Ones and Zeroes 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ ...

  6. LeetCode 1 Two Sum 解题报告

    LeetCode 1 Two Sum 解题报告 偶然间听见leetcode这个平台,这里面题量也不是很多200多题,打算平时有空在研究生期间就刷完,跟跟多的练习算法的人进行交流思想,一定的ACM算法积 ...

  7. 【LeetCode】Permutations II 解题报告

    [题目] Given a collection of numbers that might contain duplicates, return all possible unique permuta ...

  8. 【LeetCode】Island Perimeter 解题报告

    [LeetCode]Island Perimeter 解题报告 [LeetCode] https://leetcode.com/problems/island-perimeter/ Total Acc ...

  9. 【LeetCode】Largest Number 解题报告

    [LeetCode]Largest Number 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/largest-number/# ...

随机推荐

  1. c# 获取北京时间更新本地计算机

    class UpdateDateTime { [DllImport("Kernel32.dll")] private static extern void SetLocalTime ...

  2. win7硬盘安装方法

    Windows 7 完全硬盘安装方法 干干净净的C盘 事先准备:装好系统的电脑一台,win 7安装iso. 注: (1).Windows 7要求安装在NTFS分区,但是其他分区可以是FAT32格式! ...

  3. 解决a标签IE下点击后出现轮廓框

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 【laravel54】如果开启了自带的时间戳(Y-h-m H:s:m),getInsertId一定要手动加上created_at 和 updated_at字段填充

    [laravel54]如果开启了自带的时间戳(Y-h-m H:s:m),getInsertId一定要手动加上created_at 和 updated_at字段填充

  5. PHP:微信小程序调用【统一下单】【微信支付】【支付回调】API;XML转Array,Array转XML方法(通用)

    1.微信公众号.微信小程序开发过程中,第三方服务器与微信服务器数据交互,需要进行数据转换,必须用到这两个函数: 分别是xml_to_array.array_to_xml ; /** * 输出xml字符 ...

  6. StringBuilder.AppendFormat(String, Object, Object) 方法

    将通过处理复合格式字符串(包含零个或零个以上格式项)返回的字符串追加到此实例. 每个格式项都替换为这两个参数中任意一个参数的字符串表示形式. 说明: public StringBuilder Appe ...

  7. java项目中classpath路径到底指的是哪里?

    本文转自:http://blog.csdn.net/javaloveiphone/article/details/51994268 1.src不是classpath, WEB-INF/classes和 ...

  8. 【LeetCode】49. Anagrams (2 solutions)

    Anagrams Given an array of strings, return all groups of strings that are anagrams. Note: All inputs ...

  9. PowerDesigner 的常用方法

    http://www.cnblogs.com/studyzy/archive/2008/01/23/1050194.html PowerDesigner 的常用方法 修改外键命名规则 选择Databa ...

  10. C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求

    C# 动态创建SQL数据库(二) 使用Entity Framework  创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...